题目
Given a string s, find the longest palindromic subsequence’s length in s. You may assume that the maximum length of s is 1000.
Example 1:
Input:
“bbbab”
Output:
4
One possible longest palindromic subsequence is “bbbb”.
Example 2:
Input:
“cbbd”
Output:
2
One possible longest palindromic subsequence is “bb”.
动态规划
从示例2中可以发现"cbbd"的最长回文子序列是"dd",那么我们可以得到启发定义状态。
定义dp[i][j]:在子串 s[i…j] 中,最长回文子序列的长度为 dp[i][j]。
初始化:
这里不能按以往的dp[0][i]来初始化,因为这正是我们需要求的,但是从回文序列的定义来看,就是左右数据相等且对称。特殊情况,当只有一个字符时,回文长度为1.
那么可以初始化为dp[i][j] =1
状态转移方程:由已知推出dp[i][j]
既然回文,从两端点入手。如果s[i] == s[j],则dp[i][j] = dp[i+1][j-1]+2;否则,dp[i][j] = max(dp[i+1][j],dp[i][j-1])
结果就是dp[0][len(s)-1].
python代码
class Solution(object):
def longestPalindromeSubseq(self, s):
"""
:type s: str
:rtype: int
"""
dp = [[0 for j in range(len(s))] for i in range(len(s))]
for i in range(len(s)):
dp[i][i] = 1
for i in range(len(s)-1,-1,-1):
for j in range(i+1,len(s)):
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][len(s)-1]