题目描述 Description
定义满足以下规则字符串为规则序列,否则不是规则序列:
1.空序列是规则序列;
2.如果S是规则序列,那么(S),[S],{S}和也是规则序列;
3.如果A和B都是规则序列,那么AB也是规则序列。
例如,下面的字符串都是规则序列:
(),[],(()),([]),()[],()[()],{{}}<>,([]<>{{}}),<<{}>>
而以下几个则不是:
(,[,],)(,()),([(),<<,{(}),<{}>)
现在,给你一些由”(“、”)”、”[“、”]”、”{“、”}”、”<”、”>”构成的字符串,请判断该字符串是否为规则序列。
输入描述 Input Description
第一行:一个正整数N,表示测试数据组数;
接下来N行:每行一个括号序列(长度不超过L)。
输出描述 Output Description
共N行:对于每一个括号序列,判断其是否规则。
规则输出TRUE,否则输出FALSE。
样例输入 Sample Input
2
{()}<<>>
{{{{{}}}}
样例输出 Sample Output
TRUE
FALSE
首先我们先看某cy的一个错误的解法:
统计每个括号,比较匹配括号的出现次数是否相同。
然后。())( 就把他卡死了。
然后正解
正解就是统计的时候判断右括号出现前左括号的出现次数是否大于等于右括号出现次数+1就行了2333333333
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
char z[9999999];
char temp[9999999];
int f[9999999];
int main()
{
int a,n,c,shuzu=0;
cin>>n;
for(c=1;c<=n;c++)
{
scanf("%s",z);
int chang,zhi=0,judge=1;
chang=strlen(z);
for(a=0;a<=chang-1;a++)
{
if(z[a]=='('|| z[a]=='['|| z[a]=='{'|| z[a]=='<')
{temp[++zhi]=z[a];continue;}
if(z[a]==')'|| z[a]==']'|| z[a]=='}'|| z[a]=='>')
{
if( (z[a]==')'&&temp[zhi]=='(') || (z[a]==']'&&temp[zhi]=='[') || (z[a]=='}'&&temp[zhi]=='{') || (z[a]=='>'&&temp[zhi]=='<') )
{temp[zhi]='\0';zhi--;continue;}
else{judge=0;break;}
}
}
if(zhi!=0)judge=0;
if(judge==1)f[++shuzu]=1;
if(judge==0)shuzu++;
}
for(int w=1;w<=shuzu;w++)
{
if(f[w]==1)cout<<"TRUE"<<endl;
else cout<<"FALSE"<<endl;
}
}