Problem Description:
給一組包含[]()兩種括號(hào)的序列,檢查是否是合法的。如:
()[],([]),[()]是合法的;
()),[(),]()[,([)]是非法的。
Input:
輸入包含多組測(cè)試數(shù)據(jù),對(duì)于每組數(shù)據(jù),輸入一個(gè)只包含 '[' , ']' , '(' , ')' ,四種字符的括號(hào)序列S(1<=length(S)<=100000);
Output:
對(duì)于每組數(shù)據(jù),如果括號(hào)序列合法輸出Yes,否則輸出no。
Sample Input:
())
[(])
([[]()])
Sample Output:
No
No
Yes
思路:這題開(kāi)始是想用兩個(gè)數(shù)組,一個(gè)一維數(shù)組存儲(chǔ)輸入的數(shù)據(jù),另一個(gè)二維數(shù)組是做判斷用的,大小是a[2][6],二維數(shù)組預(yù)先會(huì)確認(rèn)各個(gè)元素,每個(gè)元素對(duì)應(yīng)一個(gè)括號(hào),如:a[0][0]存放‘(’,a[0][1]存放‘)’,這樣二維數(shù)組的第一行存放所以會(huì)出現(xiàn)的括號(hào),第二行就是“T”或者“F”(第二行的初始值為F,只有當(dāng)輸入的數(shù)據(jù)與二維數(shù)組第一行元素對(duì)應(yīng)時(shí)才會(huì)變?yōu)門(mén))用于簡(jiǎn)單的判斷輸入數(shù)據(jù),,這樣最后在用三條條件判斷語(yǔ)句判斷左右括號(hào)是否成對(duì)出現(xiàn)即可,但是第一次做完這道題并不能通過(guò),因?yàn)樗荒軐?duì)重復(fù)的括號(hào)進(jìn)行規(guī)避,例如(()這樣最后的結(jié)果也是true.所以我最后又改了方法,就是暴力求解,而且也數(shù)據(jù)不大.
代碼:
#include <stdio.h>
#include <string.h>
int main(void) {
bool flag1, flag2, flag3;
while(1) {
flag1 = true, flag2 = true, flag3 = true;
char s[10];
gets(s);
int length = strlen(s);
for(int j=0; j<length; j++){
if(s[j] == '('){
for(int i=1; i<length; i++)
if(s[i] == ')'){
flag1 = true;
break;
}
else
flag1 = false;
}
if(s[j] == '['){
for(int i=1; i<length; i++)
if(s[i] == ']'){
flag2 = true;
break;
}
else
flag2 = false;
}
if(s[j] == '{'){
for(int i=1; i<length; i++)
if(s[i] == '}'){
flag3 = true;
break;
}
else
flag3 = false;
}
}
if(flag1 == true && flag2 == true && flag3 == true)
printf("true\n");
else
printf("false\n");
}
return 0;
}?
