題目:
Given a string containing just the characters '('
, ')'
, '{'
, '}'
, '['
and ']'
, determine if the input string is valid.
The brackets must close in the correct order, "()"
and "()[]{}"
are all valid but "(]"
and "([)]"
are not.
題解:
這道題是一道很常見的老題,記得當時看嚴蔚敏的資料結構還有資料結構課上面都見過這道題,一道訓練棧的基礎題。
解題方法是:
一個個檢查給的characters,如果是左括號都入棧;如果是右括號,檢查棧如果為空,證明不能匹配,如果棧不空,彈出top,與當前掃描的括號檢查是否匹配。
全部字元都檢查完了以後,判斷棧是否為空,空則正確都匹配,不空則證明有沒匹配的。
注意:
檢查字元是用==,檢查String是用.isEqual(),因為String是引用型別,值相等但是地址可能不等。
程式碼如下:
1 public boolean isValid(String s) {
2 if(s.length()==0||s.length()==1)
3 return false;
4
5 Stack<Character> x = new Stack<Character>();
6 for(int i=0;i<s.length();i++){
7 if(s.charAt(i)=='('||s.charAt(i)=='{'||s.charAt(i)=='['){
8 x.push(s.charAt(i));
9 }else{
10 if(x.size()==0)
11 return false;
12 char top = x.pop();
13 if(s.charAt(i)==')')
14 if(top!='(')
15 return false;
16 else if(s.charAt(i)=='}')
17 if(top!='{')
18 return false;
19 else if(s.charAt(i)==']')
20 if(top!='[')
21 return false;
22 }
23 }
24 return x.size()==0;
25 }
2 if(s.length()==0||s.length()==1)
3 return false;
4
5 Stack<Character> x = new Stack<Character>();
6 for(int i=0;i<s.length();i++){
7 if(s.charAt(i)=='('||s.charAt(i)=='{'||s.charAt(i)=='['){
8 x.push(s.charAt(i));
9 }else{
10 if(x.size()==0)
11 return false;
12 char top = x.pop();
13 if(s.charAt(i)==')')
14 if(top!='(')
15 return false;
16 else if(s.charAt(i)=='}')
17 if(top!='{')
18 return false;
19 else if(s.charAt(i)==']')
20 if(top!='[')
21 return false;
22 }
23 }
24 return x.size()==0;
25 }