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

相关推荐
hhhjhl5 小时前
Undici 跨端三方库仓颉适配全流程
java·开发语言·ubuntu
染指11105 小时前
158.Agent-LangGraph-子图(共享状态和不共享状态模式)
开发语言·人工智能·python·ui·agent·agents
wangchunyu1145 小时前
JAVA JVM内存结构与运行时数据区
java·开发语言·jvm
slongzhang_5 小时前
linux 递归删除源码文件|递归删除目录下 *.js,但排除 *.min.js
linux·开发语言·javascript
云和数据.ChenGuang7 小时前
Python 常见特殊方法详解:__new__、__init__、__del__、__str__、__repr__ 与 __getattribute__
开发语言·人工智能·python·1024程序员节
xyouyuweizhu7 小时前
字节流与字符流:Java IO 的两条主线该怎么选
java·开发语言·python
多弗朗皮卡丘8 小时前
C++的IO流
开发语言·c++·io流·文件io流
骑着蜗牛撵大象3278 小时前
AI Agent 工程化开发实战(三):用 StateGraph 给智能体搭一条可回放的状态流水线
java·开发语言·jvm·ai·状态管理·langgraph·stategraph
itmigrate8 小时前
Rust 里的所有权误区:不是不写 clone 就叫高性能
开发语言·后端·rust
Brilliantwxx8 小时前
【Linux】 文件访问与路径解析:目录、文件名、dentry、路径缓冲与 dcache 全解析
linux·运维·服务器·开发语言·spring