括号匹配的最大长度问题
字数 897 2025-10-26 21:06:54

括号匹配的最大长度问题

题目描述:
给定一个只包含 '(' 和 ')' 的字符串 s,请你找出最长有效(格式正确且连续)括号子串的长度。

解题过程:

  1. 问题分析:
    有效括号字符串需要满足:
  • 每个左括号 '(' 必须有对应的右括号 ')'
  • 左括号必须在对应的右括号之前
  • 括号嵌套也必须是有效的
  1. 动态规划定义:
    定义 dp[i] 表示以第 i 个字符结尾的最长有效括号子串的长度。

  2. 状态转移方程:
    情况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. 详细解释:
  • 对于情况1:形如 "....()",直接在之前的基础上加2
  • 对于情况2:形如 "....))",需要检查与当前 ')' 匹配的左括号位置
  • i - dp[i-1] - 1 是可能与当前右括号匹配的左括号位置
  • 如果匹配成功,需要加上内部的有效长度和外部相邻的有效长度
  1. 边界条件:
  • dp[0] = 0(单个字符不可能是有效括号)
  • 需要确保下标不越界
  1. 算法步骤:
    初始化 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)
    记录最大值

  2. 示例演示:
    以字符串 "()(())" 为例:
    索引:0 1 2 3 4 5
    字符:( ) ( ( ) )
    dp值:0 2 0 0 2 6
    最终结果是6,对应整个字符串都是有效的。

括号匹配的最大长度问题 题目描述: 给定一个只包含 '(' 和 ')' 的字符串 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,对应整个字符串都是有效的。