问题描述
- 有关ACM的括号配对问题
-
问题:括号配对问题
时间限制:3000 ms | 内存限制:65535 KB
难度:3
描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([])
样例输出
No
No
Yes我的代码:总是出现WrongAnswer
#include
#include
#include
using namespace std;
int main()
{
int N;
int j=0;
int f1[5]={0,0,0,0,0};//[的个数
int f2[5]={0,0,0,0,0};//]的个数
int d1[5]={0,0,0,0,0};//(的个数
int d2[5]={0,0,0,0,0};//)的个数int g=1;//判断只包含
int a1;//用于判断[]配对
int a2;//用于判断()配对
cin>>N;
vector s(4);
if(0<N && N<5)
{for(j=0;j<N;j++)
{cin>>s[j]; //判断只包含[]() for(int k=0;k<s[j].size();k++) { if(!(s[j][k]=='[' || s[j][k]==']' || s[j][k]=='(' || s[j][k]==')')) { g=0;} }
}
for(j=0;j<N;j++)
{ a1=0;a2=0;
for(int e=0;e<5;e++)
{
f1[e]=0;
f2[e]=0;
d1[e]=0;
d2[e]=0;
}
//判断[和]个数一样,(和)个数一样
for(int h=0;h<s[j].size();h++)
{
if(s[j][h]=='[') f1[j]++;
if(s[j][h]==']') f2[j]++;
if(s[j][h]=='(') d1[j]++;
if(s[j][h]==')') d2[j]++;
}
//判断配对
for(int r=0;r<s[j].size();r++)
{
if(s[j][r]=='[') a1++;
if(s[j][r]==']') a1--;
if(a1<0) break;
if(s[j][r]=='(') a2++;
if(s[j][r]==')') a2--;
if(a2<0) break;
}
if(0<s[j].size() && s[j].size()<10000 && g==1 ){
if(s[j].size()>=3) { int p=1; for(int t=0;t<s[j].size()-2;t++) { //若字符串含有([)或(])或[(]或[)]这样的字符串则不配对 if( (s[j][t]=='(' && s[j][t+1]=='[' && s[j][t+2]==')') || (s[j][t]=='(' && s[j][t+1]==']' && s[j][t+2]==')')|| (s[j][t]=='[' && s[j][t+1]=='(' && s[j][t+2]==']')|| (s[j][t]=='[' && s[j][t+1]==')' && s[j][t+2]==']')) { p=0;} } if(p==0 || f1[j]!=f2[j] || d1[j]!=d2[j] || a1<0 || a2<0) {cout<<"No"<<endl;} else {cout<<"Yes"<<endl;} } if(s[j].size()<3) if(s[j]=="[]"||s[j]=="()") cout<<"Yes"<<endl; else cout<<"No"<<endl; }
}
}
return 0;
}