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:
4One possible longest palindromic subsequence is "bbbb".
Example 2:
Input:
"cbbd"Output:
2
One possible longest palindromic subsequence is "bb".
解题思路: 联想palindrome的性质,如果某个string为palindrome,那么在其两端分别加上同样的字母,那么新生成的string也为palindrome。反之,若给定一个String s, 若我们已知其两端字母相同,既s.charAt(0) == s.charAt(s.length()-1),那么该字符串s的最长palindrome的个数就等于
longestPalindromeSubseq(s) = 2 + longestPalindromeSubseq(s.substring(1,s.length()-1))
由此,我们可以利用动态规划的思想,利用一个二维矩阵M[][]去记录s每个substring的最长子序列的长度,既M[i][j]代表 传入string,i 到 j子字符串的最长palindrome,状态转移方程为:
if s.charAt(i) == s.charAt(j): M[i][j] = M[i-1][j+1] + 2
else: M[i][j] = Math.max( M[i+1][j], M[i][j+1])
代码实现如下:
public int longestPalindromeSubseq(String s) {
int[][]M = new int[s.length()][s.length()];
for(int i = s.length()-1; i >= 0; i--){
M[i][i] = 1;
for (int j = i+1; j < s.length(); j++){
if (s.charAt(j) == s.charAt(i)){
M[i][j] = M[i+1][j-1] + 2;
} else {
M[i][j] = Math.max(M[i+1][j], M[i][j-1]);
}
}
}
return M[0][s.length()-1];
}