动态规划,重点还是找到base case和状态转移方程
虽然这是一个字符串,但还是要用到二维的动态规划
转移方程:先分解问题,对于每个片段,我们将它向两边扩散
如果两边的字符相等,那么最长回文子序列可以直接加入这两个字符
如果两边的字符不相等,那么最长回文子序列只能加入其中的一个
那么易知base case:就是单个的字符
def longestPalindromeSubseq(self, s):
"""
:type s: str
:rtype: int
"""
n = len(s)
dp = [[0]*n for i in range(n)]
for i in range(n):
dp[i][i] = 1
for i in range(n-2,-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]) #这里不用加1,因为不一定加入后能形成回文
return dp[0][n-1]