这是力扣上一道非常简单的问题,是经典的解决括号匹配问题。当然做法是用一个栈即可解决问题。
有效的括号
这是我的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Solution { public boolean isValid(String s) { Stack<Character> st = new Stack(); boolean flag = true; for(int i=0;i<s.length();i++){ Character nowC = s.charAt(i); if(nowC=='('||nowC=='{'||nowC=='['){ st.push(nowC); }else { if(st.empty()){ flag = false; break; } char c = st.pop(); if((nowC==')'&&c!='(')||(nowC==']'&&c!='[')||(nowC=='}'&&c!='{')){ flag = false; break; } } } if(!st.empty()) flag = false; return flag; } }
|
显然我的代码是可以不费力的通过测试的。但是我还是去看了一眼题解。
这是力扣官方题解。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| class Solution { public boolean isValid(String s) { int n = s.length(); if (n % 2 == 1) { return false; }
Map<Character, Character> pairs = new HashMap<Character, Character>() {{ put(')', '('); put(']', '['); put('}', '{'); }}; Deque<Character> stack = new LinkedList<Character>(); for (int i = 0; i < n; i++) { char ch = s.charAt(i); if (pairs.containsKey(ch)) { if (stack.isEmpty() || stack.peek() != pairs.get(ch)) { return false; } stack.pop(); } else { stack.push(ch); } } return stack.isEmpty(); } }
作者:力扣官方题解 链接:https: 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
|
想必大家已经能够看到官方题解和我的代码有着一个明显的差别,那就是题解用了另一个数据结构——Map
。
用到Map
的理由也是非常的简单,就是判断小括号,中括号,大括号匹配的时候,用Map
的key-value
一一对应能够完美解决。这里的操作看似画蛇添足,但是代码在拓展性上大大增强,只需要更改键值对的内容,就可以把代码扩展到任意匹配问题。
还有一点值得一提,就是java
中的stack
实际上就是vector
的一种。整体来看,双端队列能够实现栈的所有功能,且适用范围更加广泛,所以大多数定义栈的时候都会直接用Deque
。