📅  最后修改于: 2023-12-03 15:40:00.469000             🧑  作者: Mango
给定一个字符串 s,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000。
示例 1: 输入:
"bbbab"
输出:
4
一个可能的最长回文子序列为 "bbbb"。
示例 2: 输入:
"cbbd"
输出:
2
一个可能的最长回文子序列为 "bb"。
本题可以使用动态规划解决。定义dp[i][j]
表示从i到j的子串中最长回文子序列的长度。当i=j时,该子串只有一个字符,因此dp[i][j]=1
。当i<j时,需要根据s[i]
和s[j]
的关系进行分类讨论:
当s[i]=s[j]
时,当前字符可以作为最长回文子序列的一部分,因此有dp[i][j]=dp[i+1][j-1]+2
。
当s[i]!=s[j]
时,当前字符不可能同时出现在最长回文子序列的两端,因此需要取当前子串中的最长回文子序列,即dp[i][j]=max(dp[i+1][j], dp[i][j-1])
。
最终,所求为dp[0][n-1]
,其中n为字符串s的长度。
def longestPalindromeSubseq(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]
时间复杂度:O(n^2),其中n为字符串s的长度。动态规划需要填写二维数组dp中的所有元素,时间复杂度为O(n^2)。
空间复杂度:O(n^2),其中n为字符串s的长度。需要开辟二维数组dp来存储中间状态,空间复杂度为O(n^2)。