1. 程式人生 > >括號配對問題 (一道OJ題目)

括號配對問題 (一道OJ題目)


括號配對問題
時間限制:3000 ms  |  記憶體限制:65535 KB
難度:3
描述
現在,有一行括號序列,請你檢查這行括號是否配對。
輸入
第一行輸入一個數N(0<N<=100),表示有N組測試資料。後面的N行輸入多組輸入資料,每組輸入資料都是一個字串S(S的長度小於10000,且S不是空串),測試資料組數少於5組。資料保證S中只含有"[", "]", "(", ")" 四種字元
輸出
每組輸入資料的輸出佔一行,如果該字串中所含的括號是配對的,則輸出Yes,如果不配對則輸出No
樣例輸入
3
[(])
(])
([[]()])
樣例輸出
No
No

Yes

方案1:依次消去所有相鄰的可配對的括號,直到不能繼續,然後判斷字串是否被清零

#include<stdio.h>
int length(char s[]){
	int i=0;
	while(s[i++]!='\0');
	return i-1;
}
int main(){
	char S[10000];
	int m;
	int a,b,l;
	scanf("%d",&m);
	for(;m>0;m--){
		scanf("%s",S);
		l=length(S);
		a=0;b=0;
		while(a<l){
			if(S[a]=='('){
				for(b=a+1;b<l;b++){
					if(S[b]!='\0')break;
				}
				if(S[b]==')'){
				S[a]='\0';
				S[b]='\0';
				a=0;
				continue;
				}
			}
			if(S[a]=='['){
				for(b=a+1;b<l;b++){
					if(S[b]!='\0')break;
				}
				if(S[b]==']'){
				S[a]='\0';
				S[b]='\0';
				a=0;
				continue;
				}
			}
			a++;
		}
		for(a=0;a<=l;a++){
			if(a==l)
				printf("Yes\n");
			else if(S[a]!='\0'){
				printf("No\n");
				break;
			}
		}
	}
	return 0;
}

該演算法複雜度極高,當輸入長的時候,會執行很長時間。

方案2:利用棧的思路優化

#include<stdio.h>
#define R 10000
int length(char s[]){
	int i=0;
	while(s[i++]!='\0');
	return i-1;
}
int main(){
	char A[R],B[R];
	int N;
	int l,n=0;//l為資料長度,n為棧最後一位
	bool now;
	int i;
	scanf("%d",&N);
	while(N--){
		scanf("%s",&A);
		l = length(A);
		n=0;
		now = true;
		for(i=0;i<l;i++){
			if(A[i]=='('||A[i]=='['){
				B[n] = A[i];
				n++;
			}
			else if(A[i]==')'){
				if(B[n-1]=='('){
					B[n-1] = '\0';
					n--;
				}
				else {
					now = false;
					break;
				}
			}
			else if(A[i]==']'){
				if(B[n-1]=='['){
					B[n-1] = '\0';
					n--;
				}
				else {
					now = false;
					break;
				}
			}
		}
		if(n!=0)now = false;
		if(now)printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}

該方案複雜度很低。


執行結果(第一個是方案1,第二個是方案2)