动态规划与栈解法:最长有效括号问题详解

发布时间:2026/10/27 7:58:35

动态规划与栈解法:最长有效括号问题详解 1. 题目解析与核心思路Longest Valid Parentheses最长有效括号是LeetCode上的一道经典动态规划/栈应用题目编号32难度等级为Hard。题目要求在一个仅包含(和)的字符串中找出最长的有效括号子串的长度。有效括号子串需要满足所有括号都能正确匹配闭合。1.1 问题定义与示例分析有效括号子串的判定标准每个左括号(必须有对应的右括号)匹配匹配的括号对必须正确嵌套不能交叉示例分析 输入)()()) 输出4 解释最长有效子串是()()1.2 暴力解法与复杂度分析最直观的解法是检查所有可能的子串是否有效生成所有可能的子串O(n^2)个子串对每个子串检查有效性O(n)时间记录最大有效长度时间复杂度O(n^3) —— 对于n3×10^4的字符串完全不可行2. 动态规划解法详解2.1 DP状态定义定义dp[i]表示以s[i]结尾的最长有效括号子串长度。关键观察点只有)能形成有效子串的结尾对于s[i])需要考察前一个字符s[i-1]2.2 状态转移方程情况1s[i-1] (dp[i] dp[i-2] 2 // 直接形成一对新括号情况2s[i-1] )if s[i - dp[i-1] - 1] (: dp[i] dp[i-1] 2 dp[i - dp[i-1] - 2]2.3 完整DP实现代码def longestValidParentheses(s: str) - int: n len(s) if n 0: return 0 dp [0] * n max_len 0 for i in range(1, n): if s[i] ): if s[i-1] (: dp[i] (dp[i-2] if i 2 else 0) 2 else: if i - dp[i-1] 0 and s[i - dp[i-1] - 1] (: dp[i] dp[i-1] 2 (dp[i - dp[i-1] - 2] if (i - dp[i-1]) 2 else 0) max_len max(max_len, dp[i]) return max_len2.4 DP解法复杂度分析时间复杂度O(n) —— 单次遍历字符串 空间复杂度O(n) —— 需要维护dp数组3. 栈解法详解3.1 栈解法核心思想利用栈存储索引而不是字符保持栈底元素为最后一个未匹配的右括号索引初始时栈中压入-1作为哨兵遇到(压入当前索引遇到)弹出栈顶计算当前索引与栈顶的差值3.2 栈解法实现代码def longestValidParentheses(s: str) - int: stack [-1] max_len 0 for i in range(len(s)): if s[i] (: stack.append(i) else: stack.pop() if not stack: stack.append(i) else: max_len max(max_len, i - stack[-1]) return max_len3.3 栈解法复杂度分析时间复杂度O(n) —— 单次遍历 空间复杂度O(n) —— 最坏情况下栈大小与字符串长度相同4. 最优解双指针法4.1 双指针法核心思路通过左右两次遍历统计有效括号长度从左到右遍历统计左右括号计数当left right时更新max_len当right left时重置计数从右到左遍历处理左括号多于右括号的情况4.2 双指针法实现代码def longestValidParentheses(s: str) - int: left right max_len 0 n len(s) # 从左到右扫描 for i in range(n): if s[i] (: left 1 else: right 1 if left right: max_len max(max_len, 2 * right) elif right left: left right 0 left right 0 # 从右到左扫描 for i in range(n-1, -1, -1): if s[i] (: left 1 else: right 1 if left right: max_len max(max_len, 2 * left) elif left right: left right 0 return max_len4.3 复杂度分析时间复杂度O(n) —— 两次遍历 空间复杂度O(1) —— 仅使用常数空间5. 解法对比与选择建议解法时间复杂度空间复杂度适用场景动态规划O(n)O(n)需要详细状态记录时栈O(n)O(n)需要处理嵌套结构时双指针O(n)O(1)内存受限时优先选择实际面试中推荐使用栈解法因为代码简洁直观容易解释思路处理复杂括号问题时扩展性强6. 常见错误与调试技巧6.1 边界条件处理常见错误忘记处理空字符串情况索引越界如dp[i-2]当i1时哨兵值设置不当栈解法中初始-1调试方法用简单测试用例验证如(), )(, ()()打印中间状态dp数组或栈内容6.2 特殊测试用例需要特别注意的测试用例 → 0(() → 2)()()) → 4()(() → 2((()))()) → 86.3 性能优化技巧提前终止当剩余字符数 ≤ 当前max_len时可提前结束空间优化双指针法空间最优并行处理对于超长字符串可考虑分段处理7. 题目变种与扩展7.1 变种题目统计所有有效括号子串数量LeetCode 678包含通配符的括号验证LeetCode 678生成所有有效括号组合LeetCode 227.2 实际应用场景代码语法检查括号匹配验证配置文件解析嵌套结构处理数学表达式求值我在实际刷题中发现这类括号问题有通用解题模式栈适合处理嵌套结构DP适合处理最优子结构问题双指针适合处理对称性问题对于面试准备建议重点掌握栈解法并理解如何从暴力解法逐步优化到最优解的过程。这类问题的核心在于发现括号匹配的规律性将全局问题分解为局部子问题求解。
延伸阅读

更多相关文章

2026/10/27 7:58:35

Oracle 11gR2 DB-PSU 220118 补丁落地与避坑指南

简介:Oracle 数据库 11.2.0.4 版本的 2022 年 1 月 PSU 补丁包(p33477185),面向需要为 Linux x86-64 平台数据库补齐安全修复与性能改进的 DBA 和运维人员。压缩包约 436.52MB,共 3658 个文件,涵盖大量 so …

2026/10/27 7:58:35

Prompt、Skill与Agent:大模型应用开发中的选型指南

1. 从一个真实困惑说起:为什么这三个词总被混着用刚接触大模型应用开发那阵子,我在一个技术群里看到有人问:"我想让模型帮我自动整理会议纪要,到底该写 Prompt 还是搭个 Agent?"底下回答五花八门&#xff0c…

2026/10/27 7:58:35

百度千帆API实现AI图片生成全攻略

1. 千帆API与AI图片生成技术解析百度智能云的千帆大模型平台近期开放了AI图片生成API接口,这为开发者提供了一种快速集成AI绘图能力的解决方案。不同于需要本地部署的Stable Diffusion等开源模型,千帆API采用云端服务模式,开发者只需通过简单…

2026/10/27 8:59:07

Agent Skill评测:构建以任务为中心的多维质量标尺

1. 为什么“给 Agent 装 Skill”这件事,90% 的人连评测基准都没立对?“给 Agent 装上 Skill,结果真的变好了吗?”——这问题看着像一句调侃,实则戳中了当前 Agent 开发最普遍也最危险的盲区:我们热衷于堆砌…

2026/10/27 8:59:07

JDBC元数据驱动XML自动生成:连接、模板、校验与避坑

简介:这款 XML 文件自动生成工具面向需要从数据库批量导出结构化 XML 的 Java 开发者与数据交换场景,借助 JDBC 连接数据源,将 SQL 查询结果按元素与属性组织成 XML 文档,减少手工编写和校验的重复工作。压缩包共 4 个文件&#x…

2026/10/27 8:59:07

AVSPO:音视频语义提示优化技术解析

1. 项目概述:这不是一个开源工具,而是一份前沿研究动态的“信号解码指南”“新文速刷.AVSPO.ICML 26.暂未开源”——看到这个标题,很多同行第一反应是点开GitHub仓库链接,结果发现404;第二反应是去arXiv搜AVSPO&#x…

2026/10/27 8:59:07

便携版 MySQL 客户端实战:绿色版配置、连接与数据导出避坑

简介:Navicat for MySQL 10.1.7 绿色中文版带 Key,定位于需要轻量级 MySQL 图形化管理工具的开发者、数据库运维人员以及数据库课程实验者,免安装即可启动,适合在本地或便携环境中完成连接配置、库表浏览、SQL 编辑、数据导入导出…

2026/10/27 8:59:07

Anthropic SKILL:可验证、可编排的智能体能力单元

1. 什么是SKILL?——从Anthropic官方文档里挖出的底层逻辑“SKILL”这个词在Anthropic的生态里,不是技能(skill)的普通拼写错误,也不是某个第三方插件的代号,更不是社区里以讹传讹的缩写。它是一个有明确定…

2026/10/26 0:20:20

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/26 1:53:47

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/27 0:59:21

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/27 0:02:28

WorkBuddy_新建任务与工作模式19_“模式选错”的典型代价

“模式选错”的典型代价 摘要 在软件工程中,设计模式、架构模式、并发模式乃至团队协作模式的选择,往往在项目早期就决定了后续的开发效率和维护成本。本文通过多个真实场景,剖析“模式选错”带来的典型代价——包括返工成本、技术债务累积、…

2026/10/27 0:02:28

WorkBuddy_新建任务与工作模式20_新手推荐路径

新手推荐路径 摘要 在 AI 辅助开发工具快速普及的今天,新手面对最多的困惑往往不是"工具够不够强",而是"我该从哪一步开始用"。本文提出一条经过实践验证的三阶段学习路径:先从 Ask(问答式交互)起…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑