字符串匹配问题(strs)
【题目描述】
字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包含的形式,从内到外必须是<>,(),[],{},例如。输入: [()] 输出:YES,而输入([]),([)]都应该输出NO。
【输入】
第一行为一个整数n,表示以下有多少个由括号组成的字符串。接下来的n行,每行都是一个由括号组成的长度不超过255的字符串。
【输出】
在输出文件中有n行,每行都是YES或NO。
【输入样例】
5
{}{}<><>()()[][]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
【输出样例】
YES
YES
YES
YES
NO
此题为【STL】栈中例题的plus版
四种括弧并有优先级
笔者的解法:
#include<bits/stdc++.h>
using namespace std;
bool isMatch(char ch[]){stack<int> sta;for(int i=0;i<strlen(ch);i++){if(ch[i]=='<'){if(sta.empty()||1<=sta.top()) sta.push(1);else return 0;}else if(ch[i]=='('){if(sta.empty()||2<=sta.top()) sta.push(2);else return 0;}else if(ch[i]=='['){if(sta.empty()||3<=sta.top()) sta.push(3);else return 0;}else if(ch[i]=='{'){if(sta.empty()||4<=sta.top()) sta.push(4);else return 0;}else if(ch[i]=='>'){if((!sta.empty())&&sta.top()==1) sta.pop();else return 0;}else if(ch[i]==')'){if((!sta.empty())&&sta.top()==2) sta.pop();else return 0;}else if(ch[i]==']'){if((!sta.empty())&&sta.top()==3) sta.pop();else return 0;}else if(ch[i]=='}'){if((!sta.empty())&&sta.top()==4) sta.pop();else return 0;}}if(!sta.empty()) return 0;return 1;
} int main(){int n;char ch[100][255];cin>>n;for(int i=0;i<n;i++){cin>>ch[i];}for(int j=0;j<n;j++){if(isMatch(ch[j])) cout<<"YES"<<endl;else cout<<"NO"<<endl;}return 0;
}
参考答案解法:
#include<bits/stdc++.h>
using namespace std;
int a[10001]={0},b[10001]={0};
char s[10001];
void gsy(int a[]){int i;for(i=0;i<strlen(s);i++){//将括号转换成数字,以比较括号级别if(s[i]=='{') a[i+1]=1; if(s[i]=='[') a[i+1]=2;if(s[i]=='(') a[i+1]=3;if(s[i]=='<') a[i+1]=4; if(s[i]=='>') a[i+1]=5; if(s[i]==')') a[i+1]=6; if(s[i]==']') a[i+1]=7; if(s[i]=='}') a[i+1]=8; }
}
int main(){int i,n,t=0,m,j,k;cin>>n;for(i=1;i<=n;i++){cin>>s;t=0;gsy(a);for(j=1;j<=strlen(s);j++){if(a[j]<=4)//如果是左括号if(a[j]>=b[t]) b[++t]=a[j];//如果括号级别顺序符合,左括号进栈else break;if(a[j]>=5)//右括号进栈if(a[j]+b[t]==9) t--;//匹配成功,出栈else t++; }if(t==0) cout<<"YES"<<endl;else cout<<"NO"<<endl;}return 0;
}