括号匹配的最大长度问题
字数 897 2025-10-26 21:06:54
括号匹配的最大长度问题
题目描述:
给定一个只包含 '(' 和 ')' 的字符串 s,请你找出最长有效(格式正确且连续)括号子串的长度。
解题过程:
- 问题分析:
有效括号字符串需要满足:
- 每个左括号 '(' 必须有对应的右括号 ')'
- 左括号必须在对应的右括号之前
- 括号嵌套也必须是有效的
-
动态规划定义:
定义 dp[i] 表示以第 i 个字符结尾的最长有效括号子串的长度。 -
状态转移方程:
情况1:当 s[i] = ')' 且 s[i-1] = '(' 时
dp[i] = dp[i-2] + 2 (如果 i >= 2)
情况2:当 s[i] = ')' 且 s[i-1] = ')' 时
如果 s[i - dp[i-1] - 1] = '(',那么:
dp[i] = dp[i-1] + 2 + dp[i - dp[i-1] - 2]
- 详细解释:
- 对于情况1:形如 "....()",直接在之前的基础上加2
- 对于情况2:形如 "....))",需要检查与当前 ')' 匹配的左括号位置
- i - dp[i-1] - 1 是可能与当前右括号匹配的左括号位置
- 如果匹配成功,需要加上内部的有效长度和外部相邻的有效长度
- 边界条件:
- dp[0] = 0(单个字符不可能是有效括号)
- 需要确保下标不越界
-
算法步骤:
初始化 dp 数组全为0
遍历字符串的每个位置 i(从1开始):
如果 s[i] = ')':
如果 s[i-1] = '(':dp[i] = (i>=2 ? dp[i-2] : 0) + 2
否则如果 i-dp[i-1]-1 >= 0 且 s[i-dp[i-1]-1] = '(':
dp[i] = dp[i-1] + 2 + (i-dp[i-1]-2 >= 0 ? dp[i-dp[i-1]-2] : 0)
记录最大值 -
示例演示:
以字符串 "()(())" 为例:
索引:0 1 2 3 4 5
字符:( ) ( ( ) )
dp值:0 2 0 0 2 6
最终结果是6,对应整个字符串都是有效的。