我有一个问题,我必须使用递归编写算法(不能使用循环)。
问题说我的函数应该检查给定的字符串是否是“平衡”。
该字符串只包含字母(无符号)且仅包含(“[”,“”“))括号。
(例如:“[aa] [abbsa]”)。递归函数检查字符串是否“平衡”
假设每一个“开括号”(“[‘)具有一个闭合一个(’]”),换句话说,该串中的括号是平衡的,而且也没有必要检查。
字符串始终是这两种格式之一:
- 简单的字符串:特征。
它只包含没有括号的字符。 (例如:“aaabbcc”)。
- 与字符串2子串:
该字符串是从第一格式。
该字符串来自第二格式,并且左边的字符(不包括括号)的数量(让它称为重量)是偶数,右边的权重也是如此。
该字符串来自第二格式,并且左侧的权重也是ODD,右侧的权重也是如此。
[LEFT] [RIGHT]
LEFT:它本身就是一个子字符串,它可以实际上处于两种格式之一S(简单字符串或与2次字符串字符串)
RIGHT:本身是一个子串,实际上可以是对两种格式的(简单的字符串或字符串2子串)
编辑:该字符串是有效的,没有必要检查它是否合法。它总是提到的格式和示例之一(可能也更复杂,但它总是合法的)。
编辑:字符串只能是第一种格式或第二种格式。如果它是第二种格式,那么它包含第一种格式,它必须以“[”开头并以“]”结尾。
例如:“aaabbbb”(第1格式)。 “[aa] [bbbb]”(第二格式)。 “[[aa] [b]] [[[a] [bbb]] [aaaa]]”(第二格式)。
该字符串是平衡,如果它满足以下条件中的至少一个:
实例:
字符串 “[ABCDE] [XYZ]” 是平衡的,因为权重和左重量均为ODD。 “
字符串”[abcde] [xyzw]“由于右权重是偶数(4是偶数),左权重是奇数(5是奇数),所以不平衡。
字符串“[abcdef] [[x] [yzw]]”是平衡的。
左边的权重为6.
子字符串“[x] [yzw]”是平衡的。 (左权重为1,右权重为3(均为ODD))。
的 “[X] [YZW]” 是4。 因此,该权重 “[ABCDEF] [[X] [YZW]]” 是平衡的,因为这两个左,右重量的是偶数。
“[ABCDE] [XYZW] [Z]” 是平衡的,即使子串 “[ABCDE] [XYZW]” 不均衡!因为它的重量是9,并且“[Z]”重1,它们都是ODD。
所以,我必须在C中编写一个递归函数,它接收一个“字符串”。
int verify_weight(char s[])
{
//Code I need here
}
它检查字符串和其中的子字符串,然后打印每一个,如果他们如果它的平衡或不。
例如: 字符串“[[aa] [b]] [[[x] [yy]] [hhhhh]]”。
它打印此:
不平衡:2,1
不平衡:1,2
平衡:3,5
不平衡:3,8
我还可以创建其他功能,以帮助解决它(仅递归)。
编辑:(ANSWER)
谢谢你们了很好的解决方案,这是@科尔马的解决方案。
代码:(@科尔马的答案后,编辑对我的函数名)
#include "stdio.h"
int between_balanced(char s[], int n)
{
if (!s[0] || (s[0] == ']' && n == 1)) return 0;
return 1 + between_balanced(s+1, n + (
s[0] == '[' ? 1 :
s[0] == ']' ? -1 :
0
));
}
int verify_weight(char s[])
{
if (s[0] == '[') {
int left = verify_weight(s+1);
int right = verify_weight(s + between_balanced(s, 0) + 2);
if (left % 2 == right % 2) {
printf("balanced: ");
} else {
printf("imbalanced: ");
}
printf("%d,%d\n", left, right);
return left+right;
} else {
return between_balanced(s, 1);
}
}
int main() {
char s[100];
scanf("%s", s);
printf("%d\n", verify_weight(s));
return 0;
}
对不起,这个长的问题,但我真的需要它的帮助,我花了很多时间试图解决它,但我不能。感谢您的时间和帮助!
这是怎么回事呢? – 2015-01-20 18:52:17
这是给我的妹妹,她有一个递归考试,她一直在学习几天。她问了我这个问题,但我解决不了问题,我们花了很多时间来解决这个问题,但我们不能。我想我们在递归中缺少一些基本的东西。 – 2015-01-20 18:54:43
你有没有试图写任何东西? – 2015-01-20 19:03:29