返回
最长有效括号子串-动力动态规划详解
前端
2023-10-24 15:15:00
引言
在计算机科学中,最长有效括号子串问题是一道经典的面试题。给定一个只包含 '(' 和 ')' 的字符串,求出其中最长有效(格式正确且连续)括号子串的长度。
例如,给定字符串 "(()",最长有效括号子串是 "()",长度为 2。再如,给定字符串 ")()())",最长有效括号子串是 "()()()",长度为 4。
问题的本质
最长有效括号子串问题本质上是一个子串匹配问题。我们需要找到一个子串,使得子串中的所有括号都是匹配的,且子串的长度尽可能长。
解决方法
解决最长有效括号子串问题的方法有多种,其中最常用的方法之一是动态规划。动态规划是一种解决复杂问题的常用方法,它通过将问题分解成更小的子问题,然后逐个解决这些子问题来最终解决原问题。
动态规划解决最长有效括号子串问题的具体步骤如下:
-
定义状态:定义一个状态dp[i],表示从字符串开头到位置i的最长有效括号子串的长度。
-
状态转移方程:根据括号匹配的规则,我们可以得到以下状态转移方程:
dp[i] = dp[i-1] + 2, 如果s[i] == ')' && s[i-1] == '(' dp[i] = 0, 否则
其中,s[i]表示字符串中第i个字符。
-
边界条件:dp[0] = 0。
-
计算:根据状态转移方程和边界条件,我们可以逐个计算出dp[1], dp[2], ..., dp[n]。
-
结果:最长有效括号子串的长度为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 為字符串的長度。
总结
最长有效括号子串问题是一个经典的算法问题,在许多场景中都有应用。动态规划是一种解决复杂问题的常用方法,可以有效地解决最长有效括号子串问题。