[Leetcode][020] Valid Parentheses (Java)
题目在这里: https://leetcode.com/problems/valid-parentheses/
【标签】Stack; String
【个人分析】这个题应该算是Stack的经典应用。先进后出 ( FILO) 的结构: 先来的左边括号跟后面的右边括号相匹配。
【代码解释】创建一个栈,如果遇到的是 '{', '(', '[', 就压到栈里面去,留着跟后面遇到的后边括号匹配。如果遇到了'}', ']', ')',首先看看栈里面 是不是空,里面有没有匹配的部分。
【一些心得】我在别人那儿看到一个很好的方法,可以通过增加一个全局map,来增加代码的扩展性: 假如还有其他类型的括号,直接加到map就可以。这样也可以使得代码简洁很多。
1 /** add a global map to make code to be 2 * more extensible and more concise */ 3 @SuppressWarnings("serial") 4 private static final Map<Character, Character> parentheseMap = 5 new HashMap<Character, Character>() {{ 6 put('(', ')'); 7 put('{', '}'); 8 put('[', ']'); 9 } 10 }; 11 12 public boolean isValid(String s) { 13 int len = s.length(); 14 if (len % 2 != 0) { 15 // for string of odd-number length, return false immediately 16 return false; 17 } 18 Stack<Character> lefts = new Stack<Character>(); 19 for (char ch : s.toCharArray()) { 20 if (parentheseMap.containsKey(ch)) { 21 lefts.push(parentheseMap.get(ch)); 22 } else { 23 // for '}', ']', ')', 24 // return false if nothing left or not matching 25 if ( lefts.isEmpty() || lefts.pop() != ch ) { 26 return false; 27 } 28 } 29 } 30 return lefts.empty(); 31 }