📅  最后修改于: 2023-12-03 15:42:21.975000             🧑  作者: Mango
这是门|门 IT 2007年的第75题,是一道经典的编程题目。
给定一个字符串 S,找出其中最长的回文子序列,并返回其长度。
例如,给定 S = "babad",最长的回文子序列为 "bab" 或 "aba",长度为 3。
本题可以使用动态规划算法来解决。
首先定义一个二维数组 dp,其中 dp[i][j] 表示从第 i 个字符到第 j 个字符中最长的回文子序列的长度。
当 i = j 时,显然 dp[i][j] = 1。
当 i < j 时,
最终的答案即为 dp[0][n-1],其中 n 为字符串 S 的长度。
class Solution:
def longestPalindromeSubseq(self, 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 - 1, -1, -1):
for j in range(i + 1, n):
if s[i] == s[j]:
dp[i][j] = dp[i + 1][j - 1] + 2
else:
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])
return dp[0][n - 1]
本题是一道比较典型的动态规划题目,需要使用二维数组来记录状态,同时需要注意区分子序列和子串的概念。此外,还需要注意边界条件的处理。