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

📅  最后修改于: 2021-05-28 04:48:41             🧑  作者: Mango

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

最长回文序列

作为另一个示例,如果给定序列为“ 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))。
以下是处理所有情况的通用递归解决方案。

C
// C program of above approach
#include 
#include 
  
// A utility function to get max of two integers
int max(int x, int y) { return (x > y) ? x : y; }
  
// Returns the length of the longest palindromic subsequence in seq
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 functions */
int main()
{
    char seq[] = "GEEKSFORGEEKS";
    int n = strlen(seq);
    printf("The length of the LPS is %d", lps(seq, 0, n - 1));
    getchar();
    return 0;
}


C++
// A Dynamic Programming based C++ program for LPS problem
// Returns the length of the longest palindromic subsequence in seq
#include 
#include 
  
// A utility function to get max of two integers
int max(int x, int y) { return (x > y) ? x : y; }
  
// Returns the length of the longest palindromic subsequence in seq
int lps(char* str)
{
    int n = strlen(str);
    int i, j, cl;
    int L[n][n]; // Create a table to store results of subproblems
  
    // Strings of length 1 are palindrome of lentgh 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 (str[i] == str[j] && cl == 2)
                L[i][j] = 2;
            else if (str[i] == str[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 */
int main()
{
    char seq[] = "GEEKS FOR GEEKS";
    int n = strlen(seq);
    printf("The lnegth of the LPS is %d", lps(seq));
    getchar();
    return 0;
}


输出:
The length of the LPS is 5

动态编程解决方案

C++

// A Dynamic Programming based C++ program for LPS problem
// Returns the length of the longest palindromic subsequence in seq
#include 
#include 
  
// A utility function to get max of two integers
int max(int x, int y) { return (x > y) ? x : y; }
  
// Returns the length of the longest palindromic subsequence in seq
int lps(char* str)
{
    int n = strlen(str);
    int i, j, cl;
    int L[n][n]; // Create a table to store results of subproblems
  
    // Strings of length 1 are palindrome of lentgh 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 (str[i] == str[j] && cl == 2)
                L[i][j] = 2;
            else if (str[i] == str[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 */
int main()
{
    char seq[] = "GEEKS FOR GEEKS";
    int n = strlen(seq);
    printf("The lnegth of the LPS is %d", lps(seq));
    getchar();
    return 0;
}
输出:
The lnegth of the LPS is 7

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

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。