1.题目描述
给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000。
示例 1:
输入:"bbbab"
输出:4
一个可能的最长回文子序列为 "bbbb"。示例 2:
输入:"cbbd"
输出:2
一个可能的最长回文子序列为 "bb"。
2.解题思路
- 状态
f[i][j] 表示 s 的第 i 个字符到第 j 个字符组成的子串中,最长的回文序列长度是多少。
- 转移方程
- 如果 s 的第 i 个字符和第 j 个字符相同的话:f[i][j] = f[i + 1][j - 1] + 2
- 如果 s 的第 i 个字符和第 j 个字符不同的话:f[i][j] = max(f[i + 1][j], f[i][j - 1]),当s[i]!=s[j] 取s[i+1..j] 和s[i..j-1]中最长的
- 根据dp方程,注意i,j遍历顺序,j从0开始从前往后遍历,i从j开始从后向前遍历
- 初始化
f[j][j] = 1 单个字符的最长回文序列是 1
- 结果
f[0][n - 1]
3.代码实现
class Solution(object):
def longestPalindromeSubseq(self, s):
"""
:type s: str
:rtype: int
"""
n=len(s)
dp=[[ 0 for _ in range(n)] for _ in range(n)]
for j in range(n):
dp[j][j]=1
for i in range(j-1,-1,-1):
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]