要注意空串也是合法的,给个样例:
4
([])
(([()])))
([()[]()])()
输出:
Yes
Yes
No
Yes
我是用的ch=gechar()读的,然后一旦搜索到]或者)就搜索前面离他最近的还没匹配的[或(
#include<bits/stdc++.h>
using namespace std;
string s;
int vis[200],n;
bool flage;
void dfs(int u) {
if(s[u]==']') {
if(u==0) { flage=false; return ; }
else {
int v=u-1;
while(vis[v]) {
if(v>0) v--;
else { flage=false; return ; }
}
if(s[v]=='['&&u<n-1) { vis[v]=vis[u]=1; dfs(u+1);}
else if(s[v]=='['&&u==n-1) { vis[v]=vis[u]=1; return ; }
else { flage=false; return ; }
}
}
else if(s[u]==')') {
if(u==0) { flage=false; return ; }
else {
int v=u-1;
while(vis[v]) {
if(v>0) v--;
else { flage=false; return ; }
}
if(s[v]=='('&&u<n-1) { vis[v]=vis[u]=1; dfs(u+1);}
else if(s[v]=='('&&u==n-1) { vis[v]=vis[u]=1; return ; }
else { flage=false; return ; }
}
}
else {
if(u==n-1) { flage=false; return ; }
else dfs(u+1);
}
}
int main() {
int T; scanf("%d",&T);
char ch=getchar();
while(T--) {
while(1) {
ch=getchar();
if(ch=='\n'||ch=='\r') break;
else s+=ch;
}
flage=true;
memset(vis,0,sizeof(vis));
n=s.size();
if(n==0) ;
else {
dfs(0);
for(int i=0;i<n;i++)
if(!vis[i]) { flage=false; break; }
}
if(flage) printf("Yes\n");
else printf("No\n");
s.clear();
}
return 0;
}