LeetCode刷题 - #20. 有效的括号

70 阅读1分钟

20. 有效的括号

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

有效字符串需满足:

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

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

示例 5:

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

思路

  • s 为空? => 返回true/false,可商量
  • s 的长度为奇数 => 不可匹配
  • 怎么匹配?何时匹配 => 遇到右括号才匹配

遇到左括号压入栈

遇到右括号,将左括号出栈,与右括号进行匹配

最终代码

class Solution {
    public boolean isValid(String s) {
        if(s == null || s.length() == 0) {
            return false;
        }
        if(s.length() % 2 != 0) {
            return false;
        }
        Deque<Character> stack = new ArrayDeque();
        for(int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if(isLeftParenthese(ch)) {
                stack.push(ch);
            } else {
                if(stack.isEmpty()) {
                // 右括号比左括号多
                    return false;
                }
                char left = stack.pop();
                if(!isMatch(left, ch)) {
                    return false;
                }
            }
        }
        return stack.isEmpty();
    }
    private boolean isLeftParenthese(char c) {
        return (c == '(') || (c == '{') || (c == '[');
    }
    private boolean isMatch(char left, char right) {
        if(left == '(') {
            return right == ')';
        } else if(left == '{') {
            return right == '}';
        } else if(left == '[') {
            return right == ']';
        } else {
            return false;
        }
    }
}