📜  最长回文子序列的Java程序| DP-12

📅  最后修改于: 2022-05-13 01:58:09.343000             🧑  作者: Mango

最长回文子序列的Java程序| DP-12

给定一个序列,找出其中最长的回文子序列的长度。

最长回文子序列

再举一个例子,如果给定的序列是“BBABCBCAB”,那么输出应该是 7,因为“BABCBAB”是其中最长的回文子序列。 “BBBBB”和“BBCBB”也是给定序列的回文子序列,但不是最长的。

1) 最优子结构:
令 X[0..n-1] 为长度为 n 的输入序列,L(0, n-1) 为 X[0..n-1] 的最长回文子序列的长度。
如果 X 的最后一个字符和第一个字符相同,则 L(0, n-1) = L(1, n-2) + 2。
否则 L(0, n-1) = MAX (L(1, n-1), L(0, n-2))。

以下是处理所有情况的通用递归解决方案。

Java
// Java program of above approach
class GFG {
 
    // A utility function to get max of two integers
    static int max(int x, int y)
    {
        return (x > y) ? x : y;
    }
    // Returns the length of the longest palindromic subsequence in seq
 
    static int lps(char seq[], int i, int j)
    {
        // Base Case 1: If there is only 1 character
        if (i == j) {
            return 1;
        }
 
        // Base Case 2: If there are only 2 characters and both are same
        if (seq[i] == seq[j] && i + 1 == j) {
            return 2;
        }
 
        // If the first and last characters match
        if (seq[i] == seq[j]) {
            return lps(seq, i + 1, j - 1) + 2;
        }
 
        // If the first and last characters do not match
        return max(lps(seq, i, j - 1), lps(seq, i + 1, j));
    }
 
    /* Driver program to test above function */
    public static void main(String[] args)
    {
        String seq = "GEEKSFORGEEKS";
        int n = seq.length();
        System.out.printf("The length of the LPS is %d",
                       lps(seq.toCharArray(), 0, n - 1));
    }
}


Java
// A Dynamic Programming based Java
// Program for the Egg Dropping Puzzle
class LPS {
 
    // A utility function to get max of two integers
    static int max(int x, int y) { return (x > y) ? x : y; }
 
    // Returns the length of the longest
    // palindromic subsequence in seq
    static int lps(String seq)
    {
        int n = seq.length();
        int i, j, cl;
        // Create a table to store results of subproblems
        int L[][] = new int[n][n];
 
        // Strings of length 1 are palindrome of length 1
        for (i = 0; i < n; i++)
            L[i][i] = 1;
 
        // Build the table. Note that the lower
        // diagonal values of table are
        // useless and not filled in the process.
        // The values are filled in a manner similar
        // to Matrix Chain Multiplication DP solution (See
        // https:// www.geeksforgeeks.org/matrix-chain-multiplication-dp-8/).
        // cl is length of substring
        for (cl = 2; cl <= n; cl++) {
            for (i = 0; i < n - cl + 1; i++) {
                j = i + cl - 1;
                if (seq.charAt(i) == seq.charAt(j) && cl == 2)
                    L[i][j] = 2;
                else if (seq.charAt(i) == seq.charAt(j))
                    L[i][j] = L[i + 1][j - 1] + 2;
                else
                    L[i][j] = max(L[i][j - 1], L[i + 1][j]);
            }
        }
 
        return L[0][n - 1];
    }
 
    /* Driver program to test above functions */
    public static void main(String args[])
    {
        String seq = "GEEKSFORGEEKS";
        int n = seq.length();
        System.out.println("The length of the lps is " + lps(seq));
    }
}
/* This code is contributed by Rajat Mishra */


输出:
The length of the LPS is 5

动态规划解决方案

Java

// A Dynamic Programming based Java
// Program for the Egg Dropping Puzzle
class LPS {
 
    // A utility function to get max of two integers
    static int max(int x, int y) { return (x > y) ? x : y; }
 
    // Returns the length of the longest
    // palindromic subsequence in seq
    static int lps(String seq)
    {
        int n = seq.length();
        int i, j, cl;
        // Create a table to store results of subproblems
        int L[][] = new int[n][n];
 
        // Strings of length 1 are palindrome of length 1
        for (i = 0; i < n; i++)
            L[i][i] = 1;
 
        // Build the table. Note that the lower
        // diagonal values of table are
        // useless and not filled in the process.
        // The values are filled in a manner similar
        // to Matrix Chain Multiplication DP solution (See
        // https:// www.geeksforgeeks.org/matrix-chain-multiplication-dp-8/).
        // cl is length of substring
        for (cl = 2; cl <= n; cl++) {
            for (i = 0; i < n - cl + 1; i++) {
                j = i + cl - 1;
                if (seq.charAt(i) == seq.charAt(j) && cl == 2)
                    L[i][j] = 2;
                else if (seq.charAt(i) == seq.charAt(j))
                    L[i][j] = L[i + 1][j - 1] + 2;
                else
                    L[i][j] = max(L[i][j - 1], L[i + 1][j]);
            }
        }
 
        return L[0][n - 1];
    }
 
    /* Driver program to test above functions */
    public static void main(String args[])
    {
        String seq = "GEEKSFORGEEKS";
        int n = seq.length();
        System.out.println("The length of the lps is " + lps(seq));
    }
}
/* This code is contributed by Rajat Mishra */
输出
The length of the lps is 5

请参阅有关最长回文子序列的完整文章 | DP-12 了解更多详情!