【刷题打卡】20. 有效的括号

108 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情

1.描述

20. 有效的括号

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

有效字符串需满足:

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

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

示例 5:

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

 

提示:

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

2.分析

不管给的字符串包含多少括号,如果是正确的,那么最里层(我称为最小单位)一定是(),[],{}其中一个,且去除最小单位以后,剩下的最小单位仍然是:(),[],{}其中一个

解法:

(1)循环移除成对的括号:(),[],{}
(2)判断移除前后字符串有无变化,若已不再变化,说明已无:(),[],{}
(3)若剩下字符串为空,说明源输入S是标准括号的组合,若不为空,则S不标准,用return not ‘’即可得到答案
例: '[]' 移除(),[],{}后——> '(())' 再次移除——>() 再次移除——> '' ——> TRUE '){' 移除(),[],{}后——> '){' 再次移除——> '){' 再次移除——> '[){]' ——> False

ps: 其实用栈效率更高,思路也是不断去除最小括号

3.AC代码

class Solution {
public:
    bool isValid(string s) {
        stack<char> stk;
        for (int i = 0; i < s.size(); i++){
            switch(s[i])
            {
                case '(':
                    stk.push(')');
                    break;
                case '{':
                    stk.push('}');
                    break;
                case '[':
                    stk.push(']');
                    break;
                case ')':
                case ']':
                case '}':
                    //judge stack empty
                    if (stk.empty()){
                        return false;
                    }

                    if (s[i] != stk.top()){
                        return false;
                    } else {
                        stk.pop();
                    }
                default:
                    break;
            }
        }

        if (!stk.empty())
            return false;
        return true;
    }
};

4.总结

括号匹配是典型的栈应用问题。

参考

简单易懂Java/C++ /Python/js/go - 有效的括号 - 有效的括号 - 力扣(LeetCode).

「代码随想录」带你搞定栈与队列!20. 有效的括号【详解】 - 有效的括号 - 力扣(LeetCode)

一次遍历,思路超级清晰,不点赞不给看 - 有效的括号 - 力扣(LeetCode)