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

相关推荐
weixin_307779131 分钟前
C++代码实现MATLAB中的crossval函数功能
开发语言·c++·算法·matlab
ttwuai7 分钟前
Go后台管理系统开源项目:4个官方仓库怎么追溯和核验
开发语言·golang·开源
谢亮_vipxieliang8 分钟前
Go Worker Pool 设计——从原理到生产级实现
开发语言·后端·golang
Escalating_xu1 小时前
【C 语言】深入理解指针(5):sizeof、strlen、数组名语义与指针笔试题全解析
java·c语言·开发语言
Nebula_g1 小时前
JavaSE加强:Stream流
java·开发语言·windows·stream·javase·流
估值探索者1 小时前
【Python量化系统工程实战 #08】从脚本到生产:量化系统上线 checklist 的最小闭环
java·开发语言·jvm·python·数据挖掘·数据·股票数据api接口
Wang's Blog1 小时前
Java框架 SpringCloud 快速入门: Nacos 环境隔离
java·开发语言·spring cloud
破芽2 小时前
python知识点整理02
开发语言·python
denlaku2 小时前
JDK 10 新特性详解
java·开发语言
cfm_29142 小时前
Java常见加密算法全解
开发语言