leetcode 20有效的括号

复制代码
class Solution {
public:
    bool isValid(string s) {
        stack<char> stk;  // 栈中存放还未匹配的左括号

        for (int i = 0; i < s.length(); i++) {

            // 1. 遇到左括号,直接入栈
            if (s[i] == '{' || s[i] == '(' || s[i] == '[') {
                stk.push(s[i]);
            }
            // 2. 遇到右括号,与栈顶左括号进行匹配
            else {
                // 栈为空,说明当前右括号没有对应的左括号
                if (stk.empty()) return false;

                // 判断当前右括号与栈顶左括号是否匹配
                if (s[i] == '}' && stk.top() != '{') return false;
                if (s[i] == ']' && stk.top() != '[') return false;
                if (s[i] == ')' && stk.top() != '(') return false;

                // 匹配成功,弹出对应的左括号
                stk.pop();
            }
        }

        // 栈为空:所有左括号都成功匹配
        // 栈不为空:还有左括号没有对应的右括号
        return stk.empty();
    }
};

思路总结

这题利用的是**栈的后进先出(LIFO)**特性。

例如:

复制代码
s = "{[()]}"

遇到 { → 入栈     {
遇到 [ → 入栈     { [
遇到 ( → 入栈     { [ (

遇到 ) → 和 ( 匹配 → 弹出
遇到 ] → 和 [ 匹配 → 弹出
遇到 } → 和 { 匹配 → 弹出

最终:栈为空 → true

核心流程可以记成:

复制代码
左括号 → 入栈

右括号 →
    栈为空          → false
    和栈顶不匹配     → false
    和栈顶匹配       → pop()

遍历结束 →
    栈为空          → true
    栈不为空        → false

时间复杂度: O(n),每个字符最多入栈、出栈一次。

空间复杂度: O(n),最坏情况下字符串全部都是左括号。

自己做的问题:

1.栈、队列用 push();vector、string、list 等序列容器通常用 push_back()

2.匹配成功要pop()

3.最终的返回stk.empty() 如果所有的右括号都匹配过了,但是左括号还有剩余,就是false

相关推荐
jaysee-sjc1 小时前
【苍穹外卖】Day01:从零认识企业级项目开发
java·开发语言·数据库·mysql·spring·intellij-idea·mybatis
ThornArmor1 小时前
《向内深潜,向外飞掠》
c语言·开发语言·c++·vim·visual studio
传奇开心果编程1 小时前
【仓颉语言基础语法学与练】第1课:从零开始
开发语言·学习·华为
君顾11 小时前
本地AI错题纠正小程序:端侧推理与错题闭环实战
java·开发语言·错题
吠品1 小时前
Python 写入 Excel 的两种主流方案实际用法总结
c语言·开发语言·算法
邪修king1 小时前
Re:Linux 系统篇(三十一):库的制作与原理Chapter2:静态链接与程序加载 —— 从磁盘 ELF 到运行中进程的完整旅程
android·linux·运维·开发语言
geovindu1 小时前
rust: Factory Method Pattern
开发语言·设计模式·rust·工厂方法模式·创建型模式
eybk1 小时前
用Kivy制作手机相片分类局域网传送工具,还能传输数据库文件
开发语言·python
企业数字化笔记1 小时前
固定资产还有借用记录能报废吗?Java前置检查、停止折旧与SQL验收
java·开发语言·sql