516.最长回文子序列。一看就懂,注释版

该博客详细介绍了如何使用动态规划算法解决寻找给定字符串中最长回文子序列的问题。通过填充二维数组,博主展示了如何计算每个子串的最长回文子序列,并返回最终结果。动态规划方法有效地避免了重复计算,提高了效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值