📅  最后修改于: 2023-12-03 14:58:26.939000             🧑  作者: Mango
这道题是GATE-CS-2006的第41题。它是一道关于编程的问题,需要编写一个程序来求解给定字符串中最长的回文子序列。
首先,观察题目,我们可以发现这是一个典型的动态规划问题。我们可以使用一个二维数组dp[i][j]来表示从i到j子字符串中最长的回文子序列长度。其中i<=j。
接下来,我们需要考虑状态转移方程。假设当前子字符串为s[i:j],那么可以分两种情况:
最后,初始化dp[i][i]为1,因为单个字符本身就是一个回文子序列。
def longest_palindrome_subsequence(s: str) -> int:
n = len(s)
dp = [[0] * n for _ in range(n)]
for i in range(n):
dp[i][i] = 1
for left in range(n-2, -1, -1):
for right in range(left+1, n):
if s[left] == s[right]:
dp[left][right] = dp[left+1][right-1] + 2
else:
dp[left][right] = max(dp[left+1][right], dp[left][right-1])
return dp[0][n-1]
以上就是本题的详细分析和代码实现。