做这道题之前在《算法》这本书上看过相似的题目--Dijkstra的双栈判断四则运算求值法,这道题算简化版吧一下就想到了用栈这个思路。
利用栈LIFO的特性判断上一个入栈的字符元素是否是匹配的括号,如果匹配就pop出来,不匹配则入栈。遍历完char数组之后判断栈的size,size是0就是符合要求的括号字符串。
以 { [ ] } 为例:
1次入栈 {
2次入栈 [
3次判断有符合要求字符,不push3,并弹出2
4次判断有符合要求字符,不push4,并弹出1
public static boolean isValid(String s) { Stack stack = new Stack(); if (s.length()==0){ return false; } for (char c:s.toCharArray() ) { if (stack.size()==0){ stack.push(c); } else if (match(c, ((Character) stack.peek()))){ stack.pop(); }else { stack.push(c); } } if (stack.size()==0){ return true; } return false; } private static boolean match(char c,char matchChar){ return c == ')' && matchChar == '(' || c == ']' && matchChar == '[' || c == '}' & matchChar == '{'; }
写match方法的时候第一次不小心把三种c==左括号情况也写上了,这样就导致了诸如"{][}"这种形式的也判断为true了,实际上明显不符合要求。