给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000 。
示例 1:
输入: "bbbab"
输出: 4
一个可能的最长回文子序列为 “bbbb”。
示例 2:
输入: "cbbd"
输出: 2
一个可能的最长回文子序列为 “bb”。
class Solution {
// dp[i][j] = 字符串s下标i到j,最长的回文子序列
// dp[i][j] = dp[i+1][j-1] + 2 if c[i]==c[j]
// otherwise dp[i][j] = max(dp[i+1][j], dp[i][j-1])
public int longestPalindromeSubseq(String s) {
char[] c = s.toCharArray();
int n = c.length;
int[][] dp = new int[n][n];
for (int i = n; i >= 0; i--) {
for (int j = i; j < n; j++) {
dp[i][j] = 1;
// dp[4][4]的情况
if (i == j) continue;
// dp[3][4]的情况
if (i + 1 > j - 1 && c[i] == c[j]) {
dp[i][j] = 2;
} else {
if (c[i] == c[j]) {
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][n-1];
}
}