题目描述
思路
需要解决三种情况:
- 括号闭合类型不匹配
- 有剩余的无法抵消的左括号
- 有无法抵消的右括号/先出现右括号
代码
class Solution {
public boolean isValid(String s) {
Map<Character, Character> map = new HashMap<>();
map.put(')', '(');
map.put(']', '[');
map.put('}', '{');
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(' || s.charAt(i) == '[' || s.charAt(i) == '{') {
stack.push(s.charAt(i));
} else if (stack.isEmpty() || stack.pop() != map.get(s.charAt(i))) {
return false;//stack.isEmpty()针对先出现右括号的情况,后面的条件针对括号类型不匹配的情况
}
}
return stack.isEmpty();//针对剩余左括号无法抵消的情况
}
}
follow-up
“左括号必须以正确的顺序闭合”,这个条件去掉如何实现? 比如,[(]) 合法
用hashMap记录三个括号分别的数量,遍历一次,左括号数目必须时刻>=右括号数目,且最后二者数目必须相等