📅  最后修改于: 2023-12-03 14:54:56.830000             🧑  作者: Mango
给出一个字符串,求它的最长回文子序列。
动态规划。
设 $dp[i][j]$ 表示字符串中 $i$ 到 $j$ 的最长回文子序列长度。
当 $i=j$ 时,$dp[i][j]=1$。
当 $i<j$ 时:
如果 $s_i=s_j$,则 $dp[i][j]=2+dp[i+1][j-1]$。
否则,$dp[i][j]=\max(dp[i+1][j], dp[i][j-1])$。
最终,$dp[0][n-1]$ 就是字符串的最长回文子序列长度。
def longest_palindrome_subseq(s: str) -> int:
n = len(s)
dp = [[0] * n for _ in range(n)]
for i in range(n):
dp[i][i] = 1
for i in range(n-2, -1, -1):
for j in range(i+1, n):
if s[i] == s[j]:
dp[i][j] = 2 + dp[i+1][j-1]
else:
dp[i][j] = max(dp[i+1][j], dp[i][j-1])
return dp[0][n-1]
assert longest_palindrome_subseq('bbbab') == 4
assert longest_palindrome_subseq('cbbd') == 2
assert longest_palindrome_subseq('abc') == 1