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

原文地址:https://www.cnblogs.com/dataoblogs/p/14121871.html