zoukankan      html  css  js  c++  java
  • LeetCode-有效的括号

    题目

    给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
    有效字符串需满足:
    左括号必须用相同类型的右括号闭合。
    左括号必须以正确的顺序闭合。

    • 注意空字符串可被认为是有效字符串。

    示例 1:

    输入: “()”
    输出: true
    示例 2:

    输入: “()[]{}”
    输出: true
    示例 3:

    输入: “(]”
    输出: false
    示例 4:

    输入: “([)]”
    输出: false

    来源:力扣(LeetCode)
    链接:力扣
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    分析

    这是一道经典的使用栈来解决问题的例题。一共有三种括号,都是左右一对,给定一组括号,判断括号是否匹配,如果匹配返回true,否则返回false。

    要想匹配的话,首先这些括号的个数肯定是偶数个;

    • 我们创建一个栈,用来存放每个左括号相匹配的右括号,之后如果当前括号是 ‘[’ ,那就向stack中push一个与之相匹配的 ‘]’ ,同样其余的左括号也是一样;
    • 那如果遇到右括号怎么办?如果在字符数组中,当前字符是 ‘]’ ,那就取出栈顶的括号和当前括号相比,如果不相等,返回false,如果相等,栈顶括号就出栈;
    • 其实还有一种情况,当栈中所有的右括号都出栈后,栈的大小是0,此时如果当前是右括号,无法比较,直接返回false。
      最后如果栈是空的,表示全部匹配,返回true,否则返回false。

    • 第一种情况:(,(,{,[,],},)
    • 第二种情况:(,{,],)
    • 第三种情况: (,{,[,],},),)

    代码实现

    class Solution {
        public boolean isValid(String s) {
            Stack<Character> stack = new Stack<Character>();
            char [] chs = s.toCharArray();
            
            for(char c : chs){
            // 遇到左括号就向栈中添加匹配的右括号
                if(c == '('){
                    stack.push(')');
                }else if(c == '['){
                    stack.push(']');
                }else if(c == '{'){
                    stack.push('}');
                }else if(stack.isEmpty()||stack.pop()!=c){
                // 对应第三种和第二种情况,不相等和栈提前为空返回false
                    return false;
                }
            }
            return stack.isEmpty();
    
        }
    }
    

    这一篇动图讲的比博主更清楚,LeetCode有效的括号

  • 相关阅读:
    IDEA热部署插件Jrebel
    Navicat Premium15安装及破解教程
    IDEA中查看类的关系图
    PV、UV、IP名词解释
    Promise由浅入深
    URLSearchParams
    二进制流学习-Blob、ArrayBuffer、File、FileReader和FormData的区别
    前端vue以数据流方式导出word----借助 jquery
    js中 == 、=== 和 Object.is() 的区别
    后端传的是二进制流,前端应该如何通过blob处理二进制文件流格式流,并实现前端下载文件流格式
  • 原文地址:https://www.cnblogs.com/dataoblogs/p/14121871.html
Copyright © 2011-2022 走看看