一、问题描述————————链接
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".
二、问题分析
动态规划问题,令dp[i][j]为字符串序列(i, j)中连续字符最大数量,可知为了得到dp[i][j],有以下两种情况,
从(i+1, j-1)到(i,j)
①如果s[i]==s[j],dp[i][j] = dp[i+1][j-1]+2
②如果s[i]!=s[j],那么dp[i][j]来源只能从max(dp[i][j-1], dp[i+1][j])
③dp[i][i] = 1; dp[i][j] = 0(i>j,不可能的情况)
在内存上来看,是顶部递归,所以代码设计如下:
三、源代码
int longestPalindromeSubseq(string s) {
int length = s.length();
int dp[length][length];
for(int i = 0; i < length; i ++)
for(int j = 0; j < length; j ++)
dp[i][j] = 0;
for(int i = length - 1; i >= 0; i --)
{
dp[i][i] = 1;
for(int j = i + 1; j < length; j ++)
{
if(s[i] == s[j])
dp[i][j] = dp[i + 1][j - 1] + 2;
else
{
int max = -1;
if(max < dp[i + 1][j])
max = dp[i + 1][j];
if(max < dp[i][j - 1])
max = dp[i][j - 1];
dp[i][j] = max;
}
}
}
return dp[0][length - 1];
}