Description
Given a string P only consist of characters with (), [] and {}. Now BaoBao wants to know whether P can form a valid bracket string.
As we can know, in a valid bracket string, for each "(", we can find a ")" behind it. In the same way, "[" and "{" also can find their "]" and "}".
For example, "()","[]","{}","(()())","({})" are the valid bracket string.
Input
The first line contains a integer T(1 <= T <= 100), which indicates the number of test cases.
The next T lines, each line only contains a bracket string Pi(|Pi| <= 2*105).
It guaranteed that the sum of |Pi| <= 2*105.
Output
For each test cases, you just output "YES" if the string is valid or "NO" for not valid.
Sample Input
4
({})
{{}}
({[}])
}{
Sample Output
YES
YES
YES
NO
解析:让我们求是否每个括号是否都一一配对。
#include<stdio.h>
#include <string.h>
char a[200005],b[200005]; //b[]来用标记该括号是否成功配对
int main()
{
int n,len,i,shi,s;
scanf("%d",&n);
while(n--){
scanf("%s",a);
len=strlen(a);
for(i=0;i<len;i++) b[i]=0; //初始化b[]
if(len%2!=0){ //如果不是偶数,那么肯定不能一一配对,直接错
printf("NO\n");
continue;
}
for(i=0;i<len-1;i++){
shi=0; //初始定义未找到
if(a[i]=='('){
for(s=i+1;s<len;s++){
if(a[s]==')'&&b[s]==0){
shi=1; //找到!
b[i]=1,b[s]=1; //配对成功,赋1
break;
}
}
}else if(a[i]=='{'){
for(s=i+1;s<len;s++){
if(a[s]=='}'&&b[s]==0){
shi=1;
b[i]=1,b[s]=1;
break;
}
}
}else if(a[i]=='['){
for(s=i+1;s<len;s++){
if(a[s]==']'&&b[s]==0){
shi=1;
b[i]=1,b[s]=1;
break;
}
}
}
if(shi==0&&(a[i]=='('||a[i]=='['||a[i]=='{')) break;
//如果shi为0且a[i]为左括号,因为如果是右括号,那么shi肯定为0
}
shi=1; //假设都成功配对,那么b[]应该都为1
for(i=0;i<len;i++){
if(b[i]==0){ //如果找到有0
shi=0; //没有成功配对
break;
}
}
if(shi==1) printf("YES\n");
else printf("NO\n");
}
return 0;
}