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有效的括号

  • 相关阅读:
    博客园Js设置
    springboot练习笔记
    相关的其他文件
    设计模式之----代理模式
    JSP的四种范围
    io流读写及相关内容
    缓存
    gson解析json
    Android简单获得通讯录
    android服务之一 Service
  • 原文地址:https://www.cnblogs.com/dataoblogs/p/14121871.html
Copyright © 2011-2022 走看看