1355:字符串匹配問題(strs)
時間限制: 1000 ms 內存限制: 65536 KB
提交數: 8310 通過數: 2849
【題目描述】
字符串中只含有括號 (),[],<>,{},判斷輸入的字符串中括號是否匹配。如果括號有互相包含的形式,從內到外必須是<>,(),[],{},例如。輸入: [()] 輸出:YES,而輸入([]),([)]都應該輸出NO。
【輸入】
第一行爲一個整數n,表示以下有多少個由括好組成的字符串。接下來的n行,每行都是一個由括號組成的長度不超過255的字符串。
【輸出】
在輸出文件中有n行,每行都是YES或NO。
【輸入樣例】
5
{}{}<><>()()[][]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
<}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
【輸出樣例】
YES
YES
YES
YES
NO
思路:內到外必須是<>,(),[],{},我們給它們定個優先級,用映射來定優先級。
1、當某個符號的左闊符時,若果棧空或棧頂符號優先級小於等於,可以入棧。
2、否者不能入棧,匹配失敗。
3、如果是右闊符時,棧頂非空且棧頂是此時的左括號 sk.top()+4==a[i] ,匹配成功,出棧。
4、否則匹配失敗。
5、根據匹配標誌,輸出結果。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N = 300;
const char f[] = {'{','[','(','<','}',']',')','>'};//左部分和右部分間隔4
int T, a[N],sta[N];
int main(){
cin >> T;
while(T --){
string s;
cin >> s;
int lena = s.size();
int top = 0;
bool flag1 = true;//最開始默認匹配
for(int i = 0; i < lena ;i++)
for(int j = 0; j < 8; j++)
if(s[i] == f[j])
{//建立映射
a[i] = j;
break;
}
for(int i = 0; i < lena;i++)
if(a[i] <= 3){
if(!top || a[i] >= sta[top])
sta[++top] = a[i];
else
{
flag1 = false;
break;
}
}
else{
if(top && sta[top] + 4 == a[i])
top--;
else
{
flag1 = false;
break;
}
}
if(top) cout << "NO\n";
else if(flag1) cout << "YES\n";
else cout << "NO\n";
}
return 0;
}