LeetCode-有效的括号

133 阅读1分钟

这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

题目:

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。  

  • 示例 1:

输入:s = "()" 输出:true

  • 示例 2:

输入:s = "()[]{}" 输出:true

  • 示例 3:

输入:s = "(]" 输出:false

  • 示例 4:

输入:s = "([)]" 输出:false

  • 示例 5:

输入:s = "{[]}" 输出:true  

提示:

1 <= s.length <= 10^4

s 仅由括号 '()[]{}' 组成

思路:

使用栈stack的方式
  1. 排除边界值: 若字符串为空则字符串无效 由于字符串s仅由括号 '()[]{}' 组成,若字符串的长度非偶数,那么肯定存在未配对的括号,则字符串无效

  2. 创建一个HashMap pairs

key值为3种右括号,value值为对应的左括号,用来判断括号是否为相对应,key值选右括号是为了在遍历的时候出现右括号的情况,能够快速知道右括号所对应的左括号是什么

  1. 遍历字符串s:
  • 首先取出来的元素必定是左括号('(','[','{'),然后将元素进栈,一直到取出的元素是右括号(')',']','}')

  • 这时若栈是空的,则该右括号没有匹配的左括号,或者匹配的左括号在右括号的右边,那么字符串无效

  • 再根据右括号对比栈顶元素,是否就是右括号所对应的左括号,若不是,则字符串无效

image.png

class Solution {
    public boolean isValid(String s) {
        int n = s.length();
        if (n == 0 || 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);
            }
        }
        //若stack为空,说明括号都正确匹配了,则字符串有效;stack不为空,则出现了多余的左括号
        return stack.isEmpty();
    }
}