第三部分 數據結構 -第一章 棧-1355:字符串匹配問題(strs)

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;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章