算法初探LeetCode-有效的括号

67 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

LeetCode20:有效的括号

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号。

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 1<=s.length<=1041 <= s.length <= 10^4
  • s 仅由括号 '()[]{}' 组成

思路分析

栈先入后出特点恰好与本题括号排序特点一致,即若遇到左括号入栈,遇到右括号时将对应栈顶左括号出栈,则遍历完所有括号后 stack 仍然为空。

思路是遍历字符,遇到左括号,就入栈,遇到右括号,尝试与栈顶元素匹配,匹配成功就出栈,匹配失败,说明遇到了无法匹配的右括号,直接返回fase退出。如果全都是合法的括号,都匹配成功了,最后栈应该是空的。

需要注意一些边界,当栈是空的时候(要么一直匹配到,要么之前的都成功匹配了),如遇右括号,肯定 是无法匹配的,直接返回false。

还可以做剪枝,先看字串长度,如果是奇数,就直接返回false。奇数个不可能全都匹配,必然有一个落单。

算法代码

public boolean isValid(String s) {
    if ((s.length() & 0x01) != 0) {
        return false;
    }
    Stack<Character> parenthesisStack = new Stack<>();
    for (char ch : s.toCharArray()) {
        if (ch == '{' || ch == '(' || ch == '[') {
            parenthesisStack.push(ch);
        } else if (!parenthesisStack.empty()){
            char top = parenthesisStack.peek();
            if (top == '{' && ch == '}') {
                parenthesisStack.pop();
            } else if (top == '(' && ch == ')') {
                parenthesisStack.pop();
            } else if (top == '[' && ch == ']') {
                parenthesisStack.pop();
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
    return parenthesisStack.empty();
}

算法复杂度

  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(1)O(1)

掘金(JUEJIN)一起进步,一起成长!