class Solution {
public int longestPalindromeSubseq(String s) {
int len = s.length();
int[][] dp = new int[len + 1][len + 1];
for(int i = len - 1; i >= 0; i--){
// 递推方程中不会计算到 i = j 的情况,所以对该情况进行初始化,单个字符串的回文长度为1
dp[i][i] = 1;
// j ≠ i
for(int j = i + 1; j < len; j++){
if(s.charAt(i) == s.charAt(j)){
// 相等那么就往外面扩,左右各扩一个,即+2
dp[i][j] = dp[i + 1][j - 1] + 2;
}else{
// 选择最优的单向内缩
// i和j指向的字符不相等,要么去掉i指向的字符,要么去掉j指向的字符
// 左缩,dp[i + 1][j]
// 右缩,dp[i][j - 1]
dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
}
}
}
return dp[0][len - 1];
}
}
516.最长回文子序列。一看就懂,注释版
最新推荐文章于 2025-12-05 14:37:41 发布
该博客详细介绍了如何使用动态规划算法解决寻找给定字符串中最长回文子序列的问题。通过填充二维数组,博主展示了如何计算每个子串的最长回文子序列,并返回最终结果。动态规划方法有效地避免了重复计算,提高了效率。
1063

被折叠的 条评论
为什么被折叠?



