Leetcode 20:有效的括号

题目描述:

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

有效字符串需满足:

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

示例 1:

输入:s = "()"

输出:true

示例 2:

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

输出:true

示例 3:

输入:s = "(]"

输出:false

示例 4:

输入:s = "([)]"

输出:false

示例 5:

输入:s = "{[]}"

输出:true

提示:

1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成

解法:栈

思路:

1、由于左括号和右括号是闭合的,所以要满足是有效的括号,其字符串长度应为偶数。如果为奇数,则表明必然有一个括号不匹配,可直接返回false。

2、利用栈先进后出的特点,遍历字符串:

1)如果遇到左括号,则直接入栈。

2)如果遇到右括号,则查看栈顶元素是否与当前右括号匹配

  • 如果不匹配,直接返回false。
  • 如果匹配,则继续循环。

3、循环结束。若栈为空,则表明是有效的括号,若栈不为空,则表明不是有效的括号。

代码:

class Solution {
    public boolean isValid(String s) {
        //字符串的长度为奇数,则不匹配
        if (s.length() % 2 == 1){
            return false;
        }
        Stack<Character> stack = new Stack<>();
        for (char c : s.toCharArray()) {
            //如果是左括号,则直接入栈
            if (c == '(' || c == '{' || c == '[') {
                stack.push(c);
            } else {
                //如果为右括号,但是栈已经为空,返回false
                if (stack.isEmpty()){
                    return false;
                } 
                //获取栈顶元素
                char top = stack.pop();
                //括号匹配
                if (c == ')' && top != '('){
                    return false;
                } 
                if (c == '}' && top != '{'){
                    return false;
                } 
                if (c == ']' && top != '['){
                    return false;
                } 
            }
        }
        return stack.isEmpty();
    }
}


版权声明:本文为weixin_47382783原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。