温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何编写代码实现一个字符串的最长回文子序列

发布时间:2021-10-14 15:35:20 来源:亿速云 阅读:124 作者:iii 栏目:编程语言

本篇内容介绍了“如何编写代码实现一个字符串的最长回文子序列”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

import java.util.Arrays;

/**
 * @author pxu
 * @create 2021/4/7-5:57 下午
 */
public class Nc154 {
    

    public int longestPalindromeSubSeq (String s) {

        int n = s.length();
        /**
         * 在for循环运行过程中,dp[j]中的数据代表s从i到j的子串中的最长回文序列的长度
         * 在for运行结束后,dp[j]中的数据代表s从0到j的子串中的最长回文序列的长度,所
         * 以程序最后返回的结果就是dp[n-1]的值。
         */
        int[] dp = new int[n];

        /**
         * 填充为1的原因是,每一个字符都是一个长度为1的回文串
         */
        Arrays.fill(dp,1);

        for (int i = n-2;i>=0;i--) {

            /**
             * pre总是代表在字符串s从i+1到j-1的子串的最长的回文序列的长度,所以其初始值被设置为0
             */
            int pre=0;
            for (int j=i+1;j<n;j++) {
                /**
                 * 因为第i个字符可能会和第j个字符结合成回文对,导致原有dp[j]_old的值变为在dp[j-1]基础上
                 * 增加2形成新的dp[j]_new,但是如果第i个字符也可以和第j+1个字符结合成回文对,这时候
                 * 对于第j+1个字符来说,第j个字符是没有和第i个字符结合的(因为第i个字符,只能和后面的一个字符结合)
                 * ,所以dp[j+1]的新值应该是dp[j]的旧值的基础上增加2得到。所以每次进入循环的时候需要把dp[j]的值
                 * 记录在temp变量中,在本次循环结束之前,将值传递给pre,以便于在下一次循环中如果下一个字符也可以
                 * 和第i个字符结合时,更新dp中的值
                 */
                int temp = dp[j];
                if (s.charAt(i) == s.charAt(j)) {
                    dp[j] = pre + 2;
                }else {
                    dp[j] = Math.max(dp[j],dp[j-1]);
                }

                pre = temp;
            }
        }
        return dp[n-1];

    }

}

“如何编写代码实现一个字符串的最长回文子序列”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI