题目描述
给出一个字符串,判断其中的左右括号是否匹配。
注:需同时判断左右圆括号 (
和 )
,左右中括号 [
和]
,左右大括号 {
和}
。
不需要考虑括号之间的优先级的问题,也就是说,小括号包含大括号,也是被允许的。
输入
一行一个字符串,以字符@为结尾。
输出
若匹配,输出 YES,若不匹配,则输出 NO。
样例输入
a(cc[])bbb()@
样例输出
YES
样例输入2
a(cc[)]bbb()@
样例输出2
NO
代码
思路:
- 将字符串中的各个括号过滤出来,剔除其他字符。
- 字符串比较操作没有数字方便,将对应的括号转换成成对的和相等的数字对,比如1,9 对应字符
{
}
。- 遍历数组把能凑成10的数字对过滤,注意判断数字对的顺序也会影响判断。
- 递归如果发现最后数组长度是奇数或者长度为偶数且不再变化说明不符合规则,只有长度为零说明可以按照规则一一配对。
#include <stdio.h>
#include <string.h>
char str[305];
void func(int bracket_str[], int len) {
int leave[305] = {0};
int start = 0, right = len, index = 0;
int res = 0;
while (start < right) {
if (start + 1 == right || bracket_str[start] + bracket_str[start + 1] != 10 || bracket_str[start] > bracket_str[start + 1]) {
leave[index++] = bracket_str[start++];
res++;
} else {
start += 2;
}
}
if (index == 0) {
printf("YES");
return;
} else {
if (index % 2 != 0) {
printf("NO");
return;
} else {
if (index == len) {
printf("NO");
return ;
}
func(leave, index);
}
}
}
int main() {
scanf("%s", str);
int bracket_str[305] = {0};
int len = 0;
for (int i = 0, j = 0; i < strlen(str); i++) {
switch (str[i]) {
case '@':
break;
case '(':
bracket_str[j++] = 1;
len++;
break;
case ')':
bracket_str[j++] = 9;
len++;
break;
case '[':
bracket_str[j++] = 2;
len++;
break;
case ']':
bracket_str[j++] = 8;
len++;
break;
case '{':
bracket_str[j++] = 3;
len++;
break;
case '}':
bracket_str[j++] = 7;
len++;
break;
default:
break;
}
}
if (len % 2 != 0 || bracket_str[0] > 3 || bracket_str[len - 1] < 4) {
printf("NO");
} else {
func(bracket_str, len);
}
return 0;
}