括号匹配(二)
时间限制:1000 ms | 内存限制:65535 KB
难度:6
-
描述
- 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的-
输入
- 第一行输入一个正整数N,表示测试数据组数(N<=10)
每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100
输出 - 对于每组测试数据都输出一个正整数,表示最少需要添加的括号的数量。每组测试输出占一行 样例输入
-
4 [] ([])[] ((] ([)]
样例输出 -
0 0 3
2
-
-
总的来说,它有几种情况 [] (((()))) ((( ]]]]] [((] (([)] 这个操作类似于栈,但不能用栈操作 ,因为对后两种操作时要遍历栈,还不能保证其元素丢失,因此我们 用数组进行栈的操作 ,若能找到可以匹配的,就先让其匹配
# include<stdio.h> # include<string.h> int main(){ int t; char a[105],b[105]; scanf("%d",&t); getchar(); while(t--) { int k=0; int c1,c2,count; count=0; scanf("%s",a); for(int i=0;i<strlen(a);i++) { c2=0; if(a[i]=='('||a[i]=='[') b[k++]=a[i]; else if((k>0&&a[i]==')'&&b[k-1]=='(')||(k>0&&a[i]==']'&&b[k-1]=='[')) k--; else { c1=k; while(c1) { if((a[i]==')'&&b[c1-1]=='(')||(a[i]==']'&&b[c1-1]=='[')) { c2=1; break; } c1--; } if(!c2) count++; else { count=count +k-c1; k=c1-1; } } } count+=k; printf("%d\n",count); } return 0; }
-
- 第一行输入一个正整数N,表示测试数据组数(N<=10)