1.题目
给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000。
示例 1:
输入:
“bbbab”
输出:
4
一个可能的最长回文子序列为 “bbbb”。
示例 2:
输入:
“cbbd”
输出:
2
一个可能的最长回文子序列为 “bb”。
2.解题过程
难度是中等,要用动态规划的方法去记录dp状态,dp[i][j]代表从i到j字符串中的最长回文子串长度,
当s[i]=s[j]时,dp[i][j] = dp[j+1][j-1]+2
当s[i]!=s[j]时,dp[i][j] = max(dp[j+1][j],dp[i][j-1])
i是倒序遍历,j是i+1到length-1的遍历
代码:
class Solution(object):
def longestPalindromeSubseq(self, s):
length = len(s)
dp = [[0 for _ in range(length)] for _ in range(length)]
for i in range(length-1, -1, -1):
dp[i][i] = 1
for j in range(i+1, length):
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][length-1]
s = Solution()
s.longestPalindromeSubseq('acdcb')