LeetCode 32:最长有效括号 —— 栈 + 标记法 题解

LeetCode 32:最长有效括号 ------ 栈 + 标记法 题解

🔗 题目链接

👉 https://leetcode.cn/problems/longest-valid-parentheses/

📖 题目概要

给你一个只包含 '('')' 的字符串,找出最长有效(连续、合法)括号子串的长度。

  • 有效括号:必须成对、顺序正确、连续
  • 示例:"(()" → 输出 2")()())" → 输出 4

✅ 本题解法:栈 + 标记法(你的 AC 代码思路)

核心思想

  1. 记录所有匹配成功的括号位置
  2. mask 数组标记匹配成功的位置为 1
  3. 最后遍历 mask 数组,找最长连续 1 的长度,即为答案

💡 详细解题思路

1. 算法步骤

  • 第一步 :遍历字符串,遇到 ( 就把下标压入栈
  • 第二步 :遇到 ) 时,如果栈不为空,说明匹配成功
    • 弹出栈顶下标 j
    • mask[j]mask[i] 都标记为 1
  • 第三步 :遍历 mask 数组,统计最长连续 1的长度,就是最长有效括号长度

2. 为什么这个方法正确?

  • 只有真正成对匹配的括号才会被标记 1
  • 有效括号一定是连续一段,所以直接求最长连续 1 即可
  • 时间、空间都很优秀,逻辑直观易懂

✅ AC 代码(你的原版代码,可直接提交)

java 复制代码
class Solution {
    public int longestValidParentheses(String s) {
        int len = s.length();
        if(len <= 1) return 0;
        char[] ss = s.toCharArray();
        int[] mask = new int[len];
        Deque<Integer> stack = new LinkedList<Integer>();
        
        // 第一步:栈匹配括号,标记合法位置
        for(int i=0;i<len;i++) {
            if(ss[i] == '(') {
                stack.push(i);
            } else {
                if(!stack.isEmpty()) {
                    int j = stack.pop();
                    mask[i] = 1;
                    mask[j] = 1;
                }
            }
        }
        
        // 第二步:找最长连续 1 的长度
        int res = 0;
        int cur = 0;
        for(int i=0;i<len;i++) {
            if(mask[i] == 1) {
                cur++;
                res = Math.max(res,cur);
            } else {
                cur = 0;
            }
        }
        return res;
    }
}

⏱️ 复杂度分析

指标 复杂度 说明
时间复杂度 O(n) 仅两次线性遍历
空间复杂度 O(n) 栈 + mask 数组开销

📌 核心总结

  1. 栈用来匹配括号,记录下标
  2. mask 数组用来标记合法位置
  3. 最后统计最长连续 1,就是答案
  4. 思路简单、好写、不易错,面试首选写法

📝 面试高频问答

1. 为什么要存下标,不存字符?

因为我们需要标记位置,最后统计连续合法段长度。

2. 为什么最后要遍历 mask 数组?

因为有效括号一定是连续的,最长连续 1 就是最长有效长度。

3. 这个方法和纯 DP 比有什么优势?

  • 逻辑更简单
  • 不用推导 DP 方程
  • 代码短、不容易写错
相关推荐
RisunJan6 分钟前
Android 面试知识点整理
android·面试·职场和发展
一条大祥脚7 分钟前
26杭电暑期第八场(后半)快读|快写|tarjan|路径DP|mex转化|扫描线|前缀和|二分图
数据结构·算法·tarjan·杭电多校·强联通分量·动态规划dp
奈斯先生Vector10 分钟前
从“能调用”到“可运营”:AI Agent 进入多模型时代后的架构升级
java·javascript·数据库·人工智能·算法·架构·aigc
Json____13 分钟前
宿舍安全卫生检查系统:Node 全栈开发实战
java·前端·数据库·毕业设计·课程设计·毕设·wwwoop.com
pnoker16 分钟前
36 个驱动模块:应对协议碎片化
java·物联网·modbus·工业互联网·opc ua
码上有光17 分钟前
Linux:进程控制和进程替换
java·linux·服务器·进程控制·进程替换
默辨19 分钟前
我用Java后端的视角读了一遍JoyAgent-JDGenie
java·开发语言
2601_9561219722 分钟前
Bellman-ford算法
算法
SQL-First布道者24 分钟前
⚡ Spring JDBC 完整体系 · 第 5 讲 · Spring Boot Starter JDBC
java·spring boot·spring·mybatis·spring jdbc