返回

最长有效括号子串-动力动态规划详解

前端

引言

在计算机科学中,最长有效括号子串问题是一道经典的面试题。给定一个只包含 '(' 和 ')' 的字符串,求出其中最长有效(格式正确且连续)括号子串的长度。

例如,给定字符串 "(()",最长有效括号子串是 "()",长度为 2。再如,给定字符串 ")()())",最长有效括号子串是 "()()()",长度为 4。

问题的本质

最长有效括号子串问题本质上是一个子串匹配问题。我们需要找到一个子串,使得子串中的所有括号都是匹配的,且子串的长度尽可能长。

解决方法

解决最长有效括号子串问题的方法有多种,其中最常用的方法之一是动态规划。动态规划是一种解决复杂问题的常用方法,它通过将问题分解成更小的子问题,然后逐个解决这些子问题来最终解决原问题。

动态规划解决最长有效括号子串问题的具体步骤如下:

  1. 定义状态:定义一个状态dp[i],表示从字符串开头到位置i的最长有效括号子串的长度。

  2. 状态转移方程:根据括号匹配的规则,我们可以得到以下状态转移方程:

    dp[i] = dp[i-1] + 2,  如果s[i] == ')' && s[i-1] == '('
    dp[i] = 0,             否则
    

    其中,s[i]表示字符串中第i个字符。

  3. 边界条件:dp[0] = 0。

  4. 计算:根据状态转移方程和边界条件,我们可以逐个计算出dp[1], dp[2], ..., dp[n]。

  5. 结果:最长有效括号子串的长度为max(dp[1], dp[2], ..., dp[n])。

代码实现

以下是用Python实现的动态规划算法解决最长有效括号子串问题的代码:

def longest_valid_parentheses(s):
  """
  求解最长有效括号子串的长度

  参数:
    s: 输入的字符串

  返回:
    最长有效括号子串的长度
  """

  # 定义状态
  dp = [0] * len(s)

  # 计算状态
  for i in range(1, len(s)):
    if s[i] == ')':
      if s[i-1] == '(':
        dp[i] = dp[i-1] + 2
      elif i >= 2 and s[i-1] == ')' and s[i-2] == '(':
        dp[i] = dp[i-2] + 2 + dp[i-1]

  # 返回结果
  return max(dp)

时间复杂度和空间复杂度

动态规划算法解决最长有效括号子串问题的時間複雜度為 O(n),其中 n 為字符串的長度。空間複雜度為 O(n),其中 n 為字符串的長度。

总结

最长有效括号子串问题是一个经典的算法问题,在许多场景中都有应用。动态规划是一种解决复杂问题的常用方法,可以有效地解决最长有效括号子串问题。