美文网首页算法刷题
LeetCode刷题-有效的括号

LeetCode刷题-有效的括号

作者: 小鲨鱼FF | 来源:发表于2021-06-22 07:15 被阅读0次

    前言说明

    算法学习,日常刷题记录。

    题目连接

    有效的括号

    题目内容

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

    有效字符串需满足:

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

    示例1:

    输入:s = "()"

    输出:true

    示例2:

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

    示例3:

    输入:s = "(]"

    输出:false

    示例4:

    输入:s = "([)]"

    输出:false

    示例5:

    输入:s = "{[]}"

    输出:true

    提示:

    1 <= s.length <= 10^4

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

    分析过程

    通过栈后进先出的特性来解答,后进先出使得可以有效地去掉成对的括号。

    遍历字符串,进行栈的操作。

    当遇到左括号时,入栈。

    当遇到和左括号同类型的右括号时,出栈,这时刚好消掉一对成对的括号。

    如果最后没有括号剩下,那么刚好是成对出现的括号,是有效的括号。

    如果最后有括号剩下,那么有不成对出现的括号,不是有效的括号。

    解答代码

    class Solution {
        public boolean isValid(String s) {
            // 定义栈保存括号
            Stack<Character> stack = new Stack<>();
    
            for (int i = 0; i < s.length(); ++i) {
                char c = s.charAt(i);
    
                if ('(' == c || '{' == c || '[' == c) {
                    // 若是左括号,压入栈
                    stack.push(c);
                }
    
                if (')' == c || '}' == c || ']' == c) {
                    // 若是右括号,先判断栈是否为空,若为空,证明没有对应的左括号,可以马上判定为无效括号
                    if (stack.size() <= 0) {
                        return false;
                    }
    
                    // 取栈的顶元素
                    char top = stack.peek();
    
                    // 和栈的顶元素对比是否可以组成括号
                    switch (top) {
                        case '(':
                            if (c == ')') {
                                // 若可以组成括号,把栈的顶元素推出
                                stack.pop();
                            } else {
                                // 若不可以组成括号,可以马上判定为无效括号
                                return false;
                            }
                            break;
                        case '{':
                            if (c == '}') {
                                // 若可以组成括号,把栈的顶元素推出
                                stack.pop();
                            } else {
                                // 若不可以组成括号,可以马上判定为无效括号
                                return false;
                            }
                            break;
                        case '[':
                            if (c == ']') {
                                // 若可以组成括号,把栈的顶元素推出
                                stack.pop();
                            } else {
                                // 若不可以组成括号,可以马上判定为无效括号
                                return false;
                            }
                            break;
                    }
                }
            }
    
            // 若栈的全部左括号都被推出,证明刚好组成有效括号
            // 若栈的的左括号有剩余,证明有多出的左括号,那么不是有效括号
            return stack.size() == 0;
        }
    }
    

    提交结果

    执行用时2ms,时间击败78.85%的用户,内存消耗36.4MB,空间击败84.69%的用户。

    运行结果

    原文链接

    原文链接:有效的括号

    相关文章

      网友评论

        本文标题:LeetCode刷题-有效的括号

        本文链接:https://www.haomeiwen.com/subject/gxeoeltx.html