📅  最后修改于: 2023-12-03 15:26:28.714000             🧑  作者: Mango
最长平衡子序列的长度问题是一个典型的动态规划问题,其难点在于设计状态和状态转移方程。
给定一个仅包含 '(' 和 ')' 两种字符的字符串 s,找出最长连续的平衡子序列,返回该子序列的长度。平衡子序列是指在该子序列中, '(' 和 ')' 的数量相等。
我们可以定义 $dp[i]$ 为以第 $i$ 个字符为结尾的最长连续平衡子序列长度。注意,这里子序列需要连续,也就是说,$dp[i]$ 表示以第 $i$ 个字符为结尾的平衡子序列的长度。
状态转移方程如下:
最终答案为 $\max{dp}$。
def longest_balanced_subsequence(s: str) -> int:
n = len(s)
dp = [0] * n
res = 0
for i in range(1, n):
if s[i] == '(':
dp[i] = 0
else:
if s[i-1] == '(':
dp[i] = dp[i-2] + 2
elif i-1-dp[i-1] >= 0 and s[i-1-dp[i-1]] == '(':
dp[i] = dp[i-1] + dp[i-2-dp[i-1]] + 2
res = max(res, dp[i])
return res