当前位置: 首页 > news >正文

最长有效括号-leetcode

题目描述

给你一个只包含 '('')' 的字符串,找出最长有效(格式正确且连续)括号 的长度。

左右括号匹配,即每个左括号都有对应的右括号将其闭合的字符串是格式正确的,比如 "(()())"

示例 1:

输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"

示例 2:

输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"

示例 3:

输入:s = ""
输出:0

提示:

  • 0 <= s.length <= 3 * 104
  • s[i]'('')'

解法一

思路:

第一步:明确 dp 数组的含义(至关重要)

定义 dp[i] 表示:以索引 i 结尾的、最长有效括号子串的长度。

第二步:分析基础状态

如果 s[i] 是左括号 '(',它不能作为一个有效括号子串的结尾,有效括号必须以右括号 ')' 结尾。

  • 所以,s[i] == '(' 时,dp[i] = 0
  • 只需要在 s[i] == ')' 时去推导状态转移方程。

第三步:分类讨论,推导状态转移方程

只看 s[i] == ')' 的情况,那么就要看它前面一个字符 s[i-1] 是什么,这里分为两种情况:

情况 1:前面是左括号,即 s[i-1] == '('

长这样:...... ( ) 索引:...... i-1 i

这种是最简单的,s[i-1]s[i] 刚好凑成了一对 ()

  • 这对 () 贡献了 2 的长度。
  • 那这对 () 之前还有没有有效括号呢?有的话也要连起来!之前的有效括号是以 i-2 结尾的,长度为 dp[i-2]
  • 状态转移方程 1: dp[i] = dp[i-2] + 2 (前提是 i >= 2)

情况 2:前面也是右括号,即 s[i-1] == ')'

长这样:...... ) ) 索引:...... i-1 i

这种情况稍微复杂一点。因为 s[i-1]')',它前面可能已经形成了一段有效的括号子串。 以 i-1 结尾的有效括号长度是 dp[i-1]。 我们要想让当前的 s[i](也就是 ')')有效,就必须跨过前面那段已经成型的有效括号,去它前面找有没有对应的 '('

  1. 找匹配的左括号位置: 跳过 dp[i-1] 的长度,那个位置的索引是 pre = i - dp[i-1] - 1
  2. 判断是否匹配: 如果 s[pre] == '(',太好了!当前的 s[i] 和它匹配上了。
    • 匹配上的这一对括号贡献了 2 的长度。
    • 被包在中间的有效括号长度是 dp[i-1]
    • pre 之前,可能还有连着的有效括号(以 pre-1 结尾),长度是 dp[pre-1]dp[i - dp[i-1] - 2]
  3. 状态转移方程 2: dp[i] = dp[i-1] + 2 + dp[i - dp[i-1] - 2] (前提是 pre >= 0s[pre] == '(')

代码:

public int longestValidParentheses(String s) {int maxLen = 0;int[] dp = new int[s.length()]; // 默认全为 0for (int i = 1; i < s.length(); i++) {// 只处理右括号的情况if (s.charAt(i) == ')') {// 情况1: 形如 "()"if (s.charAt(i - 1) == '(') {dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2;} // 情况2: 形如 "))"else if (i - dp[i - 1] > 0 && s.charAt(i - dp[i - 1] - 1) == '(') {dp[i] = dp[i - 1] + 2;// 加上匹配左括号之前可能存在的有效子串长度if (i - dp[i - 1] - 2 >= 0) {dp[i] += dp[i - dp[i - 1] - 2];}}// 更新最大长度maxLen = Math.max(maxLen, dp[i]);}}return maxLen;
}
http://www.jsqmd.com/news/681699/

相关文章:

  • Linux进程间通信新姿势:用sigaction和sigqueue实现带数据的信号传递(C语言实战)
  • 别再死记硬背了!手把手带你用UVM实战AHB2APB Bridge验证(附完整代码与面试高频题解析)
  • 从表情包到技术栈:用C语言和libgif库手把手解析一个GIF文件(附完整源码)
  • 从加工到仿真:手把手教你解读光学面形检测报告与Zemax波前分析结果
  • 专业的江门口腔医院 - 行业深度观察
  • 车间参观通道设计公司怎么选?从惟妙设计看现代工厂视觉升级的“隐形工程” - 企师傅推荐官
  • 2026贵阳装修公司深度横评:旧房改造与室内装修哪家好 - 年度推荐企业名录
  • 【技术图解】一图胜千言:用生活场景彻底搞懂TP/FP/TN/FN!
  • 2026年京津冀地区夹胶玻璃靠谱供应商有哪些,哪家口碑好 - 工业品牌热点
  • 那些被你放过期的微信立减金,其实能变成实打实的零钱 - 团团收购物卡回收
  • 2026年贵阳装修公司对比:绿豆家装vs华浔品味vs生活家vs乐享装饰全面评测 - 年度推荐企业名录
  • 从SVM到投资组合:拉格朗日乘子法在机器学习与金融中的三个实战案例解析
  • 告别内存碎片:用JeMalloc优化你的C++服务端程序(附性能对比测试)
  • 沙河市润都金属制品可信度高吗,山东市场口碑排名情况 - 工业品牌热点
  • Android动画观影终极指南:Hanime1Plugin如何彻底改变你的追番体验
  • 告别命令行:用Python脚本一键调用trtexec,批量转换ONNX到TensorRT Engine
  • 2026贵州高考冲刺机构推荐:遵义树人学校助力高三复读与高一升学 - 深度智识库
  • ComfyUI图像处理插件终极指南:如何用AI实现像素级精细化控制
  • 2026.04.20作业 - # AtCoder Beginner Contest 454 E - LRUD Moving
  • 2026年亲测有效:10款工具将论文AI率从80%降至9.7%(附免费降AIGC教程) - 降AI实验室
  • 2026年润都金属制品在山东地区口碑怎样,值得选吗 - myqiye
  • 百联 OK 卡闲置不用?教你轻松盘活闲置资金 - 团团收购物卡回收
  • 避坑指南:ESP8266烧录MQTT固件连接华为云,为什么你的AT+MQTTUSERCFG总报错?
  • 贴片按键开关厂家口碑怎样,靠谱的企业有哪些? - myqiye
  • K3路由器散热翻新与梅林固件刷机全记录(附硅胶片更换教程)
  • 3步解决Navicat试用到期问题:macOS无限重置方案详解
  • 手把手教你用AXI4-Lite在ZYNQ上做个简易“聊天室”:PS发指令,PL回数据
  • 别再只盯着噪声系数了!ATF-54143 LNA设计中的稳定性、匹配与非线性性能权衡实战
  • OSGEARTH3项目实战:如何将你的GIS数据(Shapefile/GeoTIFF)变成可交互的3D图层?
  • 低速PP无纺布分切机厂家怎么选?来自常州奥普托的一线经验与案例拆解 - 企师傅推荐官