题目描述:
示例 1:
示例 2:
思路分析:
例如字符串s [a,b,c,b,d,a](数组形式方便表示),最长回文子序列长度5,最长回文子序列abcbda,dp[0][5],
则它的上一个回文子序列:
因为s[0] == s[5],则dp[0 + 1][5 - 1] 为bcbd
因为s[1] != s[4] 所以两种可能
- dp[1 + 1][4]跳过左边字符为cbd
- dp[1][4-1]跳过右边字符为bcb.
可以看到bcb回文序列为2,cbd为1(单个字符回文长度为1),因此应该选择dp[1][3]也就是bcb)
因为s[1] == s[3],则dp[1+1][3-1]为c就结束了。
将整个过程倒过来,从回文长度为1的字符开始,即可求解。
代码实现:
class Solution {
public int longestPalindromeSubseq(String s) {
int len = s.length();
int[][] dp = new int[len][len];
for (int i = 0; i < len; i++) {
dp[i][i] = 1;
}
for (int i = len - 2; i >= 0; i--) {
char left = s.charAt(i);
for (int j = i + 1; j < len; j++) {
char right = s.charAt(j);
if (left == right) {
dp[i][j] = dp[i + 1][j - 1] + 2;
} else {
dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
}
}
}
return dp[0][len - 1];
}
}