我有一个问题需要使用递归算法编写(不能使用循环),题目要求我的函数应该检查给定的字符串是否“平衡”。该字符串仅包含字母(没有符号)和括号(“[”、“]”)。假设每个“开放括号”(“[”)都有一个对应的“闭合括号”(“]”),换句话说,字符串中的括号是平衡的,并且不需要检查。字符串始终是以下两种格式之一:
1. 简单字符串:字符。 2. 由两个子字符串组成的字符串:“[LEFT][RIGHT]”。
左侧子字符串可以是两种格式之一(简单字符串或由两个子字符串组成的字符串),右侧子字符串也可以是两种格式之一。如果字符串满足以下条件之一,则被认为是平衡的:
1. 字符串是第一种格式。 2. 字符串是第二种格式并且左侧的字符数(称为权重)是偶数,右侧的权重也是偶数。 3. 字符串是第二种格式并且左侧的权重是奇数,右侧的权重也是奇数。
例如,字符串“[abcde][xyz]”是平衡的,因为左侧权重和右侧权重都是奇数。
字符串"[abcde][xyzw]"不平衡,因为右侧权重是偶数(4是偶数),左侧权重是奇数(5是奇数)。
字符串"[abcdef][[x][yzw]]"是平衡的。 左侧权重为6。 子字符串"[x][yzw]"是平衡的。 (左侧权重为1,右侧权重为3(两者都是奇数))。 "[x][yzw]"的权重为4。 因此,"[abcdef][[x][yzw]]"是平衡的,因为左侧和右侧的权重都是偶数。
"[[abcde][xyzw]][Z]"是平衡的,即使子字符串"[abcde][xyzw]"不平衡! 因为它的权重为9,"[Z]"的权重为1,它们都是奇数。
所以,我必须在C中编写一个递归函数,接收一个“字符串”。
1. 简单字符串:字符。 2. 由两个子字符串组成的字符串:“[LEFT][RIGHT]”。
左侧子字符串可以是两种格式之一(简单字符串或由两个子字符串组成的字符串),右侧子字符串也可以是两种格式之一。如果字符串满足以下条件之一,则被认为是平衡的:
1. 字符串是第一种格式。 2. 字符串是第二种格式并且左侧的字符数(称为权重)是偶数,右侧的权重也是偶数。 3. 字符串是第二种格式并且左侧的权重是奇数,右侧的权重也是奇数。
例如,字符串“[abcde][xyz]”是平衡的,因为左侧权重和右侧权重都是奇数。
字符串"[abcde][xyzw]"不平衡,因为右侧权重是偶数(4是偶数),左侧权重是奇数(5是奇数)。
字符串"[abcdef][[x][yzw]]"是平衡的。 左侧权重为6。 子字符串"[x][yzw]"是平衡的。 (左侧权重为1,右侧权重为3(两者都是奇数))。 "[x][yzw]"的权重为4。 因此,"[abcdef][[x][yzw]]"是平衡的,因为左侧和右侧的权重都是偶数。
"[[abcde][xyzw]][Z]"是平衡的,即使子字符串"[abcde][xyzw]"不平衡! 因为它的权重为9,"[Z]"的权重为1,它们都是奇数。
所以,我必须在C中编写一个递归函数,接收一个“字符串”。
int verify_weight(char s[])
{
//Code I need here
}
它检查字符串及其中的子字符串,如果它们是平衡的,则打印每个子字符串。例如:字符串“[[aa][b]][[[x][yy]][hhhhh]]”,则会打印以下内容:
不平衡:2,1
不平衡:1,2
平衡:3,5
不平衡:3,8
我也可以创建其他函数来帮助解决它(只能使用递归)。
编辑:(答案)
感谢@kolmar提供的好解决方案。
代码:(在@kolmar的答案后编辑我的函数名称)
#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;
}
非常抱歉这是一个很长的问题,但我真的需要帮助,我花了很多时间尝试解决它,但我没能成功。感谢您的时间和帮助!