括號配對問題 (一道OJ題目)
阿新 • • 發佈:2019-02-04
括號配對問題
時間限制: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)