给一字符串 s, 找出在 s 中的最长回文序列的长度. 你可以假设 s 的最大长度为 1000
.
样例
Example1
Input: "bbbab"
Output: 4
Explanation:
One possible longest palindromic subsequence is "bbbb".
Example2
Input: "bbbbb"
Output: 5
解题思路:
设dp[i][j]表示在s[i...j]中最长回文序列的长度
初始化:
对于序列型,需要从序列长度开始考虑,而不是i=0,开始。所以
长度为0时,dp[i][i] = 1
长度为1时,若s[i] == s[i-1]则dp[i][i-1] = 2,否则dp[i][i-1] = 1
递推式:
注意计算顺序,不能按照i的顺序去算,而要按照序列的长度 j-i 依次计算
public class Solution {
/**
* @param s: the maximum length of s is 1000
* @return: the longest palindromic subsequence's length
*/
public int longestPalindromeSubseq(String s) {
// write your code here
if(s == null || s.length() == 0)
return 0;
char[] ss = s.toCharArray();
int[][] dp = new int[ss.length][ss.length];
//init
//length == 0 (i - i = 0)
for(int i=0; i<ss.length; i++)
dp[i][i] = 1;
//length == 1 (i-1 - i = 1)
for(int i=1; i<ss.length; i++){
if(ss[i] == ss[i-1])
dp[i-1][i] = 2;
else
dp[i-1][i] = 1;
}
for(int len = 2; len<ss.length; len++){
for(int i=0; i + len<ss.length; i++){
int j = i + len;
dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1]);
if(ss[i] == ss[j])
dp[i][j] = Math.max(dp[i][j], dp[i+1][j-1]+2);
}
}
return dp[0][ss.length-1];
}
}