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

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

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.filldp,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.charAti) == s.charAtj)) {
                    dp[j] = pre + 2;
                }else {
                    dp[j] = Math.maxdp[j],dp[j-1]);
                }

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

    }

}

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注