P a r t Part Part 1 1 1 读题
字符串中只含有括号 ( ) () () , [ ] [] [] , < > <> <>, { } \{\} {} ,判断输入的字符串中括号是否匹配。
如果括号有互相包含的形式,从内到外必须是 ( ) () () , [ ] [] [] , < > <> <>, { } \{\} {}
例如,输入 [ ( ) ] [()] [()] 输出 Y E S YES YES,而输入 ( [ ] ) ([]) ([]), ( [ ) ] ([)] ([)]都输出 N O NO NO。
输入格式
第一行为一个整数 n n n,表示以下有多少个由括号组成的字符串。
接下来的 n n n行,每行都是一个由括号组成的长度不超过 255 255 255的字符串。
输出格式
有 n n n行,每行都是 Y E S YES YES或 N O NO NO
输入样例
5
{}{}<><>()()[][]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
输出样例
YES
YES
YES
YES
NO
数据范围与提示
字符串长度 S ≤ 255 S≤255 S≤255
P a r t Part Part 2 2 2 思路
本题稍有难度,主要是在判断四个括号的大小关系以及判断前方括号类型(圆括号、方括号、花括号需要判断),不满足就输出 N O NO NO
P a r t Part Part 3 3 3 代码
方法1:有函数
#include<bits/stdc++.h>
using namespace std;
int top,t,d[5];//1 <> 2 () 3 [] 4 {}
char s[10086];
bool f;
string a;
void wro(){
cout<<"NO"<<endl;
f=false;
return;
}
void is_di(int x){
for(int i=1;i<x;i++)if(d[i]!=0)wro();
}
int main(){
cin>>t;
for(int i=1;i<=t;i++){
cin>>a;
f=1,top=0;
d[1]=0,d[2]=0,d[3]=0,d[4]=0;
for(int j=0;j<a.size();j++){
if(f==false)break;
if(a[j]=='<'){
d[1]++;
s[++top]=a[j];
}
else if(a[j]=='('){
is_di(2);
d[2]++;
s[++top]=a[j];
}
else if(a[j]=='['){
is_di(3);
d[3]++;
s[++top]=a[j];
}
else if(a[j]=='{'){
is_di(4);
d[4]++;
s[++top]=a[j];
}
else if(a[j]=='>'){
if(s[top]=='<'&&d[1]!=0){
top--;
d[1]--;
}
else wro();
}
else if(a[j]==')'){
if(s[top]=='('&&d[2]!=0){
top--;
d[2]--;
}
else wro();
}
else if(a[j]==']'){
if(s[top]=='['&&d[3]!=0){
top--;
d[3]--;
}
else wro();
}
else if(a[j]=='}'){
if(s[top]=='{'&&d[4]!=0){
top--;
d[4]--;
}
else wro();
}
}
if(top==0&&f==true)cout<<"YES"<<endl;
if(top!=0&&f==true)cout<<"NO"<<endl;
}
return 0;
}
方法2:无函数
#include<bits/stdc++.h>
using namespace std;
int top,t,d[5];//1 <> 2 () 3 [] 4 {}
char s[10086];
bool f;
string a;
void is_di(int x){
for(int i=1;i<x;i++){
if(d[i]!=0){
cout<<"NO"<<endl;
f=false;
break;
}
}
}
int main(){
cin>>t;
for(int i=1;i<=t;i++){
cin>>a;
f=1,top=0;
d[1]=0,d[2]=0,d[3]=0,d[4]=0;
for(int j=0;j<a.size();j++){
if(f==false)break;
if(a[j]=='<'){
d[1]++;
s[++top]=a[j];
}
else if(a[j]=='('){
is_di(2);
d[2]++;
s[++top]=a[j];
}
else if(a[j]=='['){
is_di(3);
d[3]++;
s[++top]=a[j];
}
else if(a[j]=='{'){
is_di(4);
d[4]++;
s[++top]=a[j];
}
else if(a[j]=='>'){
if(s[top]=='<'&&d[1]!=0){
top--;
d[1]--;
}
else{
cout<<"NO"<<endl;
f=false;
break;
}
}
else if(a[j]==')'){
if(s[top]=='('&&d[2]!=0){
top--;
d[2]--;
}
else{
cout<<"NO"<<endl;
f=false;
break;
}
}
else if(a[j]==']'){
if(s[top]=='['&&d[3]!=0){
top--;
d[3]--;
}
else{
cout<<"NO"<<endl;
f=false;
break;
}
}
else if(a[j]=='}'){
if(s[top]=='{'&&d[4]!=0){
top--;
d[4]--;
}
else{
cout<<"NO"<<endl;
f=false;
break;
}
}
}
if(top==0&&f==true)cout<<"YES"<<endl;
if(top!=0&&f==true)cout<<"NO"<<endl;
}
return 0;
}
P a r t Part Part 4 4 4 易错点
1. 1. 1.循环开始之前,要判断 f f f是否已经为 f a l s e false false,若是就结束循环
2. 2. 2.每次不满足条件时,记得加上 f = f a l s e f=false f=false,要不然可能会在 N O NO NO多输出一个 Y E S YES YES
因为以上这两条 T L E TLE TLE,找了两天才找出来问题 555 555 555,所以大家一定要注意!!!
听完后,是不是觉得很简单呢?赶快自己去试一下吧!!!