算法笔记 -- 20. 有效的括号

117 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

20. 有效的括号 - 力扣(LeetCode) (leetcode-cn.com)

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

有效字符串需满足:

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

示例 1:

输入:s = "()"
输出:true

示例 2:

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

示例 3:

输入:s = "(]"
输出:false

示例 4:

输入:s = "([)]"
输出:false

示例 5:

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

提示:

  • 1 <= s.length <= 10^4
  • s 仅由括号 '()[]{}' 组成

二、思路分析:

对于闭合的括号,我们可以发现,他们一定是左右相对正中间对称的,也就是说最左边的左括号,对应的右括号一定在最右边,如{[]}。是不是很符合栈的特性,我们将字符串依次入栈,最先进入的左括号对应的右括号一定最先出栈。

给每个括号一个代号。入栈一旦遇到括号匹配的就出栈,如果栈空就返回true,栈非空就返回false。

三、AC 代码:

class Solution {
    public boolean isValid(String s) {
        if(s.length()<=1) return false;
        char[] temp = new char[s.length()];
        int top = 0;
        for(int i=0;i<s.length();++i){
            if(s.charAt(i) == '('
                || s.charAt(i) == '['
                || s.charAt(i) == '{') {
                    temp[top++] = s.charAt(i);
                    continue;
                }

            // if(s.charAt(i) == ')' && top-1 >=0) 

            if((s.charAt(i) == ')' && top-1>=0 && temp[top-1] == '(') 
                || (s.charAt(i) == ']' && top-1>=0 && temp[top-1] == '[') 
                || (s.charAt(i) == '}' && top-1>=0 && temp[top-1] == '{')) top--;
            else temp[top++] = s.charAt(i);
        }

        return top==0;
    }
}

四、总结:

栈解决括号匹配yyds

**范文参考:

20. 有效的括号 题解 - 力扣(LeetCode) (leetcode-cn.com)

有效的括号(辅助栈法,极简+图解) - 有效的括号 - 力扣(LeetCode) (leetcode-cn.com)

【JavaScript】20. 有效的括号:栈匹配(消除游戏) - 有效的括号 - 力扣(LeetCode) (leetcode-cn.com)