力扣链接:. - 力扣(LeetCode)
动规大法开始吟唱:
dp[i][j]含义:从i到j最长回文子序列的长度
递推公式:
当s[i] == s[j]时
1. j-i<=1时, dp[i][j]为j-i+1
2. 否则,dp[i][j] 为 dp[i+1][j-1]+2
当s[i] != s[j] 时,dp[i][j] 取 dp[i][j-1] 和 dp[i+1][j] 中的较大值。注意这里不是dp[i+1][j-1],比如当a,aab时,最长的回文子序列应该是aa,如果按dp[i+1][j-1]就只能取到a
遍历顺序:dp[i][j]的状态依赖dp[i+1][j-1],所以i从大到小,j从小到大遍历
ac代码如下:
class Solution {
public int longestPalindromeSubseq(String s) {
int len = s.length();
int[][] dp = new int[len][len];
for(int i=len-1;i>=0;i--){
for(int j=i;j<len;j++){
if(s.charAt(i) == s.charAt(j)){
if(j-i<=1){
dp[i][j]=j-i+1;
}else {
dp[i][j]=dp[i+1][j-1]+2;
}
}else{
dp[i][j]=Math.max(dp[i][j-1],dp[i+1][j]);
}
}
}
return dp[0][len-1];
}
}