20. 有效的括号

151 阅读1分钟

题目描述

image.png

思路

需要解决三种情况:

  • 括号闭合类型不匹配
  • 有剩余的无法抵消的左括号
  • 有无法抵消的右括号/先出现右括号

代码

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记录三个括号分别的数量,遍历一次,左括号数目必须时刻>=右括号数目,且最后二者数目必须相等