📜  数据结构|杂项|问题4(1)

📅  最后修改于: 2023-12-03 14:54:56.830000             🧑  作者: Mango

数据结构 | 杂项 | 问题4

问题描述

给出一个字符串,求它的最长回文子序列。

思路

动态规划。

设 $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