Description
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
Example1
Input: "bbbab"
Output: 4
Explanation:
One possible longest palindromic subsequence is "bbbb".
Example2
Input: "bbbbb"
Output: 5
思路:
注意这里的subsequence是可以跳过某些字母的,用动态规划的想法,递推公式是
对于任意字符串,如果头尾字符相同,那么字符串的最长子序列等于去掉首尾的字符串的最长子序列加上首尾;如果首尾字符不同,则最长子序列等于去掉头的字符串的最长子序列和去掉尾的字符串的最长子序列的较大者。
设dp[i][j]表示第i到第j个字符间的最长回文序列的长度(i<=j)
状态转移方程:
dp[i][j]=dp[i+1][j-1] + 2\qquad if(str[i]==str[j])dp[i][j]=dp[i+1][j−1]+2if(str[i]==str[j])
dp[i][j]=max(dp[i+1][j],dp[i][j-1])\quad if(str[i]!=str[j])dp[i][j]=max(dp[i+1][j],dp[i][j−1])if(str[i]!=str[j])
还有一点需要注意的是,前边的依赖于后边的解。
比如:
dp[7][8] = s[7] == s[8] ? 2 : 1
dp[6][8] = max(dp[6][7], dp[7][8]) | (s[6] == s[8] ? 2 : 0) + dp[7][7]
dp[5][8] = max(dp[6][8], dp[5][7]) | (s[5] == s[8] ? 2 : 0) + dp[6][7]
能看出来依赖是从右向左的
代码: