516. 最长回文子序列
思路:动态规划
注意:
- 是求动态子序列(不是子串)
- 动态规划需要从后向前遍历(保持状态转移方程正确性)
- 只有一个字符时一定可以形成子序列
/**
* 516. 最长回文子序列
*
*/
public class Solution516 {
public int longestPalindromeSubseq(String s) {
int len = s.length();
char[] chars = s.toCharArray();
int[][] dp = new int[len][len];
for (int i = len - 1; i >= 0; i--) {
// 只有该位置一个字符,一定是回文子串
dp[i][i] = 1;
for (int j = i + 1; j < len; j++) {
if (chars[i] == chars[j]) {
// i 是从后往前遍历的,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][len - 1];
}
}