📜  最短的通用超序列

📅  最后修改于: 2021-05-06 21:32:44             🧑  作者: Mango

给定两个字符串str1和str2,任务是查找同时具有str1和str2作为子序列的最短字符串的长度。

例子 :

Input:   str1 = "geek",  str2 = "eke"
Output: 5
Explanation: 
String "geeke" has both string "geek" 
and "eke" as subsequences.

Input:   str1 = "AGGTAB",  str2 = "GXTXAYB"
Output:  9
Explanation: 
String "AGXGTXAYB" has both string 
"AGGTAB" and "GXTXAYB" as subsequences.

该问题与最长的公共子序列问题密切相关。以下是步骤。
1)查找两个给定字符串的最长公共子序列(lcs)。例如,“ geek”和“ eke”的lcs是“ ek”。
2)将非LCS字符(按其原始顺序,在字符串)插入到上面找到的LCS中,然后返回结果。因此,“ ek”变成“ geeke”,这是最短的常见超序列。
让我们考虑另一个示例,str1 =“ AGGTAB”和str2 =“ GXTXAYB”。 str1和str2的LCS为“ GTAB”。找到LCS后,我们将按顺序插入两个字符串的字符,然后得到“ AGXGTXAYB”
这是如何运作的?
我们需要找到同时具有字符串作为子序列和最短这种字符串的字符串。如果两个字符串的所有字符都不相同,则结果为两个给定字符串的长度之和。如果存在常见字符,那么我们不希望它们多次出现,因为任务是最大限度地减少长度。因此,我们首先找到最长的公共子序列,对该子序列进行一次出现并添加额外的字符。

Length of the shortest supersequence  
= (Sum of lengths of given two strings) 
- (Length of LCS of two given strings) 

以下是上述想法的实现。以下实现仅找到最短超序列的长度。

C++
// C++ program to find length of the
// shortest supersequence
#include 
using namespace std;
 
// Utility function to get max
// of 2 integers
int max(int a, int b) { return (a > b) ? a : b; }
 
// Returns length of LCS for
// X[0..m - 1], Y[0..n - 1]
int lcs(char* X, char* Y, int m, int n);
 
// Function to find length of the
// shortest supersequence of X and Y.
int shortestSuperSequence(char* X, char* Y)
{
    int m = strlen(X), n = strlen(Y);
 
    // find lcs
    int l = lcs(X, Y, m, n);
 
    // Result is sum of input string
    // lengths - length of lcs
    return (m + n - l);
}
 
// Returns length of LCS
// for X[0..m - 1], Y[0..n - 1]
int lcs(char* X, char* Y, int m, int n)
{
    int L[m + 1][n + 1];
    int i, j;
 
    // Following steps build L[m + 1][n + 1]
    // in bottom up fashion. Note that
    // L[i][j] contains length of LCS of
    // X[0..i - 1] and Y[0..j - 1]
    for (i = 0; i <= m; i++) {
        for (j = 0; j <= n; j++) {
            if (i == 0 || j == 0)
                L[i][j] = 0;
 
            else if (X[i - 1] == Y[j - 1])
                L[i][j] = L[i - 1][j - 1] + 1;
 
            else
                L[i][j] = max(L[i - 1][j], L[i][j - 1]);
        }
    }
 
    // L[m][n] contains length of LCS
    // for X[0..n - 1] and Y[0..m - 1]
    return L[m][n];
}
 
// Driver code
int main()
{
    char X[] = "AGGTAB";
    char Y[] = "GXTXAYB";
 
    cout << "Length of the shortest supersequence is "
         << shortestSuperSequence(X, Y) << endl;
 
    return 0;
}
 
// This code is contributed by Akanksha Rai


C
// C program to find length of
// the shortest supersequence
#include 
#include 
 
// Utility function to get
// max of 2 integers
int max(int a, int b) { return (a > b) ? a : b; }
 
// Returns length of LCS for
// X[0..m - 1], Y[0..n - 1]
int lcs(char* X, char* Y, int m, int n);
 
// Function to find length of the
// shortest supersequence of X and Y.
int shortestSuperSequence(char* X, char* Y)
{
    int m = strlen(X), n = strlen(Y);
 
    // find lcs
    int l = lcs(X, Y, m, n);
 
    // Result is sum of input string
    // lengths - length of lcs
    return (m + n - l);
}
 
// Returns length of LCS
// for X[0..m - 1], Y[0..n - 1]
int lcs(char* X, char* Y, int m, int n)
{
    int L[m + 1][n + 1];
    int i, j;
 
    // Following steps build L[m + 1][n + 1]
    // in bottom up fashion. Note that
    // L[i][j] contains length of LCS of
    // X[0..i - 1] and Y[0..j - 1]
    for (i = 0; i <= m; i++) {
        for (j = 0; j <= n; j++) {
            if (i == 0 || j == 0)
                L[i][j] = 0;
 
            else if (X[i - 1] == Y[j - 1])
                L[i][j] = L[i - 1][j - 1] + 1;
 
            else
                L[i][j] = max(L[i - 1][j], L[i][j - 1]);
        }
    }
 
    // L[m][n] contains length of LCS
    // for X[0..n - 1] and Y[0..m - 1]
    return L[m][n];
}
 
// Driver code
int main()
{
    char X[] = "AGGTAB";
    char Y[] = "GXTXAYB";
 
    printf("Length of the shortest supersequence is %d\n",
           shortestSuperSequence(X, Y));
 
    return 0;
}


Java
// Java program to find length of
// the shortest supersequence
class GFG {
 
    // Function to find length of the
    // shortest supersequence of X and Y.
    static int shortestSuperSequence(String X, String Y)
    {
        int m = X.length();
        int n = Y.length();
 
        // find lcs
        int l = lcs(X, Y, m, n);
 
        // Result is sum of input string
        // lengths - length of lcs
        return (m + n - l);
    }
 
    // Returns length of LCS
    // for X[0..m - 1], Y[0..n - 1]
    static int lcs(String X, String Y, int m, int n)
    {
        int[][] L = new int[m + 1][n + 1];
        int i, j;
 
        // Following steps build L[m + 1][n + 1]
        // in bottom up fashion. Note that
        // L[i][j] contains length of LCS
        // of X[0..i - 1]and Y[0..j - 1]
        for (i = 0; i <= m; i++) {
            for (j = 0; j <= n; j++) {
                if (i == 0 || j == 0)
                    L[i][j] = 0;
 
                else if (X.charAt(i - 1) == Y.charAt(j - 1))
                    L[i][j] = L[i - 1][j - 1] + 1;
 
                else
                    L[i][j] = Math.max(L[i - 1][j],
                                       L[i][j - 1]);
            }
        }
 
        // L[m][n] contains length of LCS
        // for X[0..n - 1] and Y[0..m - 1]
        return L[m][n];
    }
 
    // Driver code
    public static void main(String args[])
    {
        String X = "AGGTAB";
        String Y = "GXTXAYB";
 
        System.out.println("Length of the shortest "
                           + "supersequence is "
                           + shortestSuperSequence(X, Y));
    }
}
 
// This article is contributed by Sumit Ghosh


Python
# Python program to find length
# of the shortest supersequence
 
# Function to find length of the
# shortest supersequence of X and Y.
 
 
def shortestSuperSequence(X, Y):
    m = len(X)
    n = len(Y)
    l = lcs(X, Y, m, n)
 
    # Result is sum of input string
    # lengths - length of lcs
    return (m + n - l)
 
# Returns length of LCS for
# X[0..m - 1], Y[0..n - 1]
 
 
def lcs(X, Y, m, n):
    L = [[0] * (n + 2) for i in
         range(m + 2)]
 
    # Following steps build L[m + 1][n + 1]
    # in bottom up fashion. Note that L[i][j]
    # contains length of LCS of X[0..i - 1]
    # and Y[0..j - 1]
    for i in range(m + 1):
 
        for j in range(n + 1):
 
            if (i == 0 or j == 0):
                L[i][j] = 0
 
            elif (X[i - 1] == Y[j - 1]):
                L[i][j] = L[i - 1][j - 1] + 1
 
            else:
                L[i][j] = max(L[i - 1][j],
                              L[i][j - 1])
 
    # L[m][n] contains length of
    # LCS for X[0..n - 1] and Y[0..m - 1]
    return L[m][n]
 
 
# Driver code
X = "AGGTAB"
Y = "GXTXAYB"
 
print("Length of the shortest supersequence is %d"
      % shortestSuperSequence(X, Y))
 
# This code is contributed by Ansu Kumari


C#
// C# program to find length of
// the shortest supersequence
using System;
 
class GFG {
    // Function to find length of the
    // shortest supersequence of X and Y.
    static int shortestSuperSequence(String X, String Y)
    {
        int m = X.Length;
        int n = Y.Length;
 
        // find lcs
        int l = lcs(X, Y, m, n);
 
        // Result is sum of input string
        // lengths - length of lcs
        return (m + n - l);
    }
 
    // Returns length of LCS for
    // X[0..m - 1], Y[0..n - 1]
    static int lcs(String X, String Y, int m, int n)
    {
        int[, ] L = new int[m + 1, n + 1];
        int i, j;
 
        // Following steps build L[m + 1][n + 1]
        // in bottom up fashion.Note that
        // L[i][j] contains length of LCS of
        // X[0..i - 1] and Y[0..j - 1]
        for (i = 0; i <= m; i++) {
            for (j = 0; j <= n; j++) {
                if (i == 0 || j == 0)
                    L[i, j] = 0;
 
                else if (X[i - 1] == Y[j - 1])
                    L[i, j] = L[i - 1, j - 1] + 1;
 
                else
                    L[i, j] = Math.Max(L[i - 1, j],
                                       L[i, j - 1]);
            }
        }
 
        // L[m][n] contains length of LCS
        // for X[0..n - 1] and Y[0..m - 1]
        return L[m, n];
    }
 
    // Driver code
    public static void Main()
    {
        String X = "AGGTAB";
        String Y = "GXTXAYB";
 
        Console.WriteLine("Length of the shortest"
                          + "supersequence is "
                          + shortestSuperSequence(X, Y));
    }
}
 
// This code is contributed by Sam007


PHP


Javascript


C++
// A Naive recursive C++ program to find
// length of the shortest supersequence
#include 
using namespace std;
 
int superSeq(char* X, char* Y, int m, int n)
{
    if (!m)
        return n;
    if (!n)
        return m;
 
    if (X[m - 1] == Y[n - 1])
        return 1 + superSeq(X, Y, m - 1, n - 1);
 
    return 1
           + min(superSeq(X, Y, m - 1, n),
                 superSeq(X, Y, m, n - 1));
}
 
// Driver Code
int main()
{
    char X[] = "AGGTAB";
    char Y[] = "GXTXAYB";
    cout << "Length of the shortest supersequence is "
         << superSeq(X, Y, strlen(X), strlen(Y));
    return 0;
}


Java
// A Naive recursive Java program to find
// length of the shortest supersequence
class GFG {
    static int superSeq(String X, String Y, int m, int n)
    {
        if (m == 0)
            return n;
        if (n == 0)
            return m;
 
        if (X.charAt(m - 1) == Y.charAt(n - 1))
            return 1 + superSeq(X, Y, m - 1, n - 1);
 
        return 1
            + Math.min(superSeq(X, Y, m - 1, n),
                       superSeq(X, Y, m, n - 1));
    }
 
    // Driver code
    public static void main(String args[])
    {
        String X = "AGGTAB";
        String Y = "GXTXAYB";
        System.out.println(
            "Length of the shortest"
            + "supersequence is: "
            + superSeq(X, Y, X.length(), Y.length()));
    }
}
 
// This article is contributed by Sumit Ghosh


Python
# A Naive recursive python program to find
# length of the shortest supersequence
 
 
def superSeq(X, Y, m, n):
    if (not m):
        return n
    if (not n):
        return m
 
    if (X[m - 1] == Y[n - 1]):
        return 1 + superSeq(X, Y, m - 1, n - 1)
 
    return 1 + min(superSeq(X, Y, m - 1, n),
                   superSeq(X, Y, m, n - 1))
 
 
# Driver Code
X = "AGGTAB"
Y = "GXTXAYB"
print("Length of the shortest supersequence is %d"
      % superSeq(X, Y, len(X), len(Y)))
 
# This code is contributed by Ansu Kumari


C#
// A Naive recursive C# program to find
// length of the shortest supersequence
using System;
 
class GFG {
    static int superSeq(String X, String Y, int m, int n)
    {
        if (m == 0)
            return n;
        if (n == 0)
            return m;
 
        if (X[m - 1] == Y[n - 1])
            return 1 + superSeq(X, Y, m - 1, n - 1);
 
        return 1
            + Math.Min(superSeq(X, Y, m - 1, n),
                       superSeq(X, Y, m, n - 1));
    }
 
    // Driver Code
    public static void Main()
    {
        String X = "AGGTAB";
        String Y = "GXTXAYB";
        Console.WriteLine(
            "Length of the shortest supersequence is: "
            + superSeq(X, Y, X.Length, Y.Length));
    }
}
 
// This code is contributed by Sam007


PHP


Javascript


C++
// A dynamic programming based C program to
// find length of the shortest supersequence
#include 
using namespace std;
 
// Returns length of the shortest
// supersequence of X and Y
int superSeq(char* X, char* Y, int m, int n)
{
    int dp[m + 1][n + 1];
 
    // Fill table in bottom up manner
    for (int i = 0; i <= m; i++) {
        for (int j = 0; j <= n; j++) {
            // Below steps follow above recurrence
            if (!i)
                dp[i][j] = j;
            else if (!j)
                dp[i][j] = i;
            else if (X[i - 1] == Y[j - 1])
                dp[i][j] = 1 + dp[i - 1][j - 1];
            else
                dp[i][j]
                    = 1 + min(dp[i - 1][j], dp[i][j - 1]);
        }
    }
 
    return dp[m][n];
}
 
// Driver Code
int main()
{
    char X[] = "AGGTAB";
    char Y[] = "GXTXAYB";
    cout << "Length of the shortest supersequence is "
         << superSeq(X, Y, strlen(X), strlen(Y));
    return 0;
}


Java
// A dynamic programming based Java program to
// find length of the shortest supersequence
class GFG {
 
    // Returns length of the shortest
    // supersequence of X and Y
    static int superSeq(String X, String Y, int m, int n)
    {
        int[][] dp = new int[m + 1][n + 1];
 
        // Fill table in bottom up manner
        for (int i = 0; i <= m; i++) {
            for (int j = 0; j <= n; j++) {
                // Below steps follow above recurrence
                if (i == 0)
                    dp[i][j] = j;
                else if (j == 0)
                    dp[i][j] = i;
                else if (X.charAt(i - 1) == Y.charAt(j - 1))
                    dp[i][j] = 1 + dp[i - 1][j - 1];
                else
                    dp[i][j] = 1
                               + Math.min(dp[i - 1][j],
                                          dp[i][j - 1]);
            }
        }
 
        return dp[m][n];
    }
 
    // Driver Code
    public static void main(String args[])
    {
        String X = "AGGTAB";
        String Y = "GXTXAYB";
        System.out.println(
            "Length of the shortest supersequence is "
            + superSeq(X, Y, X.length(), Y.length()));
    }
}
 
// This article is contributed by Sumit Ghosh


Python
# A dynamic programming based python program
# to find length of the shortest supersequence
 
# Returns length of the shortest supersequence of X and Y
 
 
def superSeq(X, Y, m, n):
    dp = [[0] * (n + 2) for i in range(m + 2)]
 
    # Fill table in bottom up manner
    for i in range(m + 1):
        for j in range(n + 1):
 
            # Below steps follow above recurrence
            if (not i):
                dp[i][j] = j
            elif (not j):
                dp[i][j] = i
 
            elif (X[i - 1] == Y[j - 1]):
                dp[i][j] = 1 + dp[i - 1][j - 1]
 
            else:
                dp[i][j] = 1 + min(dp[i - 1][j],
                                   dp[i][j - 1])
 
    return dp[m][n]
 
 
# Driver Code
X = "AGGTAB"
Y = "GXTXAYB"
print("Length of the shortest supersequence is %d"
      % superSeq(X, Y, len(X), len(Y)))
 
# This code is contributed by Ansu Kumari


C#
// A dynamic programming based C# program to
// find length of the shortest supersequence
using System;
 
class GFG {
    // Returns length of the shortest
    // supersequence of X and Y
    static int superSeq(String X, String Y, int m, int n)
    {
        int[, ] dp = new int[m + 1, n + 1];
 
        // Fill table in bottom up manner
        for (int i = 0; i <= m; i++) {
            for (int j = 0; j <= n; j++) {
                // Below steps follow above recurrence
                if (i == 0)
                    dp[i, j] = j;
                else if (j == 0)
                    dp[i, j] = i;
                else if (X[i - 1] == Y[j - 1])
                    dp[i, j] = 1 + dp[i - 1, j - 1];
                else
                    dp[i, j] = 1
                               + Math.Min(dp[i - 1, j],
                                          dp[i, j - 1]);
            }
        }
 
        return dp[m, n];
    }
 
    // Driver code
    public static void Main()
    {
        String X = "AGGTAB";
        String Y = "GXTXAYB";
        Console.WriteLine(
            "Length of the shortest supersequence is "
            + superSeq(X, Y, X.Length, Y.Length));
    }
}
 
// This code is contributed by Sam007


PHP


Python3
# A dynamic programming based python program
# to find length of the shortest supersequence
 
# Returns length of the
# shortest supersequence of X and Y
 
import numpy as np
def superSeq(X,Y,n,m,lookup):
     
    if m==0 or n==0:
        lookup[n][m] = n+m
 
    if (lookup[n][m] == 0):    
        if X[n-1]==Y[m-1]:
            lookup[n][m] = superSeq(X,Y,n-1,m-1,lookup)+1
     
        else:
            lookup[n][m] = min(superSeq(X,Y,n-1,m,lookup)+1,
                               superSeq(X,Y,n,m-1,lookup)+1)
     
    return lookup[n][m]
     
 
 
# Driver Code
X = "AGGTAB"
Y = "GXTXAYB"
 
lookup = np.zeros([len(X)+1,len(Y)+1])
print("Length of the shortest supersequence is {}"
      .format(superSeq(X,Y,len(X),len(Y),lookup)))
 
# This code is contributed by Tanmay Ambadkar


输出:

Length of the shortest supersequence is 9

下面是解决上述问题的另一种方法
一个简单的分析得出以下简单的递归解。

Let X[0..m - 1] and Y[0..n - 1] be two 
strings and m and n be respective
lengths.

  if (m == 0) return n;
  if (n == 0) return m;

  // If last characters are same, then 
  // add 1 to result and
  // recur for X[]
  if (X[m - 1] == Y[n - 1])
     return 1 + SCS(X, Y, m - 1, n - 1);

  // Else find shortest of following two
  //  a) Remove last character from X and recur
  //  b) Remove last character from Y and recur
  else 
    return 1 + min( SCS(X, Y, m - 1, n), SCS(X, Y, m, n - 1) );

下面是基于以上递归公式的简单朴素递归解决方案。

C++

// A Naive recursive C++ program to find
// length of the shortest supersequence
#include 
using namespace std;
 
int superSeq(char* X, char* Y, int m, int n)
{
    if (!m)
        return n;
    if (!n)
        return m;
 
    if (X[m - 1] == Y[n - 1])
        return 1 + superSeq(X, Y, m - 1, n - 1);
 
    return 1
           + min(superSeq(X, Y, m - 1, n),
                 superSeq(X, Y, m, n - 1));
}
 
// Driver Code
int main()
{
    char X[] = "AGGTAB";
    char Y[] = "GXTXAYB";
    cout << "Length of the shortest supersequence is "
         << superSeq(X, Y, strlen(X), strlen(Y));
    return 0;
}

Java

// A Naive recursive Java program to find
// length of the shortest supersequence
class GFG {
    static int superSeq(String X, String Y, int m, int n)
    {
        if (m == 0)
            return n;
        if (n == 0)
            return m;
 
        if (X.charAt(m - 1) == Y.charAt(n - 1))
            return 1 + superSeq(X, Y, m - 1, n - 1);
 
        return 1
            + Math.min(superSeq(X, Y, m - 1, n),
                       superSeq(X, Y, m, n - 1));
    }
 
    // Driver code
    public static void main(String args[])
    {
        String X = "AGGTAB";
        String Y = "GXTXAYB";
        System.out.println(
            "Length of the shortest"
            + "supersequence is: "
            + superSeq(X, Y, X.length(), Y.length()));
    }
}
 
// This article is contributed by Sumit Ghosh

Python

# A Naive recursive python program to find
# length of the shortest supersequence
 
 
def superSeq(X, Y, m, n):
    if (not m):
        return n
    if (not n):
        return m
 
    if (X[m - 1] == Y[n - 1]):
        return 1 + superSeq(X, Y, m - 1, n - 1)
 
    return 1 + min(superSeq(X, Y, m - 1, n),
                   superSeq(X, Y, m, n - 1))
 
 
# Driver Code
X = "AGGTAB"
Y = "GXTXAYB"
print("Length of the shortest supersequence is %d"
      % superSeq(X, Y, len(X), len(Y)))
 
# This code is contributed by Ansu Kumari

C#

// A Naive recursive C# program to find
// length of the shortest supersequence
using System;
 
class GFG {
    static int superSeq(String X, String Y, int m, int n)
    {
        if (m == 0)
            return n;
        if (n == 0)
            return m;
 
        if (X[m - 1] == Y[n - 1])
            return 1 + superSeq(X, Y, m - 1, n - 1);
 
        return 1
            + Math.Min(superSeq(X, Y, m - 1, n),
                       superSeq(X, Y, m, n - 1));
    }
 
    // Driver Code
    public static void Main()
    {
        String X = "AGGTAB";
        String Y = "GXTXAYB";
        Console.WriteLine(
            "Length of the shortest supersequence is: "
            + superSeq(X, Y, X.Length, Y.Length));
    }
}
 
// This code is contributed by Sam007

的PHP


Java脚本


输出:

Length of the shortest supersequence is 9

上述解决方案指数O(2 min(m,n) )的时间复杂度。由于存在重叠的子问题,因此我们可以使用动态编程有效地解决此递归问题。以下是基于动态编程的实现。该解决方案的时间复杂度为O(mn)。

C++

// A dynamic programming based C program to
// find length of the shortest supersequence
#include 
using namespace std;
 
// Returns length of the shortest
// supersequence of X and Y
int superSeq(char* X, char* Y, int m, int n)
{
    int dp[m + 1][n + 1];
 
    // Fill table in bottom up manner
    for (int i = 0; i <= m; i++) {
        for (int j = 0; j <= n; j++) {
            // Below steps follow above recurrence
            if (!i)
                dp[i][j] = j;
            else if (!j)
                dp[i][j] = i;
            else if (X[i - 1] == Y[j - 1])
                dp[i][j] = 1 + dp[i - 1][j - 1];
            else
                dp[i][j]
                    = 1 + min(dp[i - 1][j], dp[i][j - 1]);
        }
    }
 
    return dp[m][n];
}
 
// Driver Code
int main()
{
    char X[] = "AGGTAB";
    char Y[] = "GXTXAYB";
    cout << "Length of the shortest supersequence is "
         << superSeq(X, Y, strlen(X), strlen(Y));
    return 0;
}

Java

// A dynamic programming based Java program to
// find length of the shortest supersequence
class GFG {
 
    // Returns length of the shortest
    // supersequence of X and Y
    static int superSeq(String X, String Y, int m, int n)
    {
        int[][] dp = new int[m + 1][n + 1];
 
        // Fill table in bottom up manner
        for (int i = 0; i <= m; i++) {
            for (int j = 0; j <= n; j++) {
                // Below steps follow above recurrence
                if (i == 0)
                    dp[i][j] = j;
                else if (j == 0)
                    dp[i][j] = i;
                else if (X.charAt(i - 1) == Y.charAt(j - 1))
                    dp[i][j] = 1 + dp[i - 1][j - 1];
                else
                    dp[i][j] = 1
                               + Math.min(dp[i - 1][j],
                                          dp[i][j - 1]);
            }
        }
 
        return dp[m][n];
    }
 
    // Driver Code
    public static void main(String args[])
    {
        String X = "AGGTAB";
        String Y = "GXTXAYB";
        System.out.println(
            "Length of the shortest supersequence is "
            + superSeq(X, Y, X.length(), Y.length()));
    }
}
 
// This article is contributed by Sumit Ghosh

Python

# A dynamic programming based python program
# to find length of the shortest supersequence
 
# Returns length of the shortest supersequence of X and Y
 
 
def superSeq(X, Y, m, n):
    dp = [[0] * (n + 2) for i in range(m + 2)]
 
    # Fill table in bottom up manner
    for i in range(m + 1):
        for j in range(n + 1):
 
            # Below steps follow above recurrence
            if (not i):
                dp[i][j] = j
            elif (not j):
                dp[i][j] = i
 
            elif (X[i - 1] == Y[j - 1]):
                dp[i][j] = 1 + dp[i - 1][j - 1]
 
            else:
                dp[i][j] = 1 + min(dp[i - 1][j],
                                   dp[i][j - 1])
 
    return dp[m][n]
 
 
# Driver Code
X = "AGGTAB"
Y = "GXTXAYB"
print("Length of the shortest supersequence is %d"
      % superSeq(X, Y, len(X), len(Y)))
 
# This code is contributed by Ansu Kumari

C#

// A dynamic programming based C# program to
// find length of the shortest supersequence
using System;
 
class GFG {
    // Returns length of the shortest
    // supersequence of X and Y
    static int superSeq(String X, String Y, int m, int n)
    {
        int[, ] dp = new int[m + 1, n + 1];
 
        // Fill table in bottom up manner
        for (int i = 0; i <= m; i++) {
            for (int j = 0; j <= n; j++) {
                // Below steps follow above recurrence
                if (i == 0)
                    dp[i, j] = j;
                else if (j == 0)
                    dp[i, j] = i;
                else if (X[i - 1] == Y[j - 1])
                    dp[i, j] = 1 + dp[i - 1, j - 1];
                else
                    dp[i, j] = 1
                               + Math.Min(dp[i - 1, j],
                                          dp[i, j - 1]);
            }
        }
 
        return dp[m, n];
    }
 
    // Driver code
    public static void Main()
    {
        String X = "AGGTAB";
        String Y = "GXTXAYB";
        Console.WriteLine(
            "Length of the shortest supersequence is "
            + superSeq(X, Y, X.Length, Y.Length));
    }
}
 
// This code is contributed by Sam007

的PHP


输出:

Length of the shortest supersequence is 9

感谢Gaurav Ahirwar提出了此解决方案。

自上而下的记忆方法:
想法是遵循简单的递归解决方案,使用查找表来避免重新计算。在计算输入结果之前,我们检查结果是否已经计算。如果已经计算过,我们将返回该结果。

Python3

# A dynamic programming based python program
# to find length of the shortest supersequence
 
# Returns length of the
# shortest supersequence of X and Y
 
import numpy as np
def superSeq(X,Y,n,m,lookup):
     
    if m==0 or n==0:
        lookup[n][m] = n+m
 
    if (lookup[n][m] == 0):    
        if X[n-1]==Y[m-1]:
            lookup[n][m] = superSeq(X,Y,n-1,m-1,lookup)+1
     
        else:
            lookup[n][m] = min(superSeq(X,Y,n-1,m,lookup)+1,
                               superSeq(X,Y,n,m-1,lookup)+1)
     
    return lookup[n][m]
     
 
 
# Driver Code
X = "AGGTAB"
Y = "GXTXAYB"
 
lookup = np.zeros([len(X)+1,len(Y)+1])
print("Length of the shortest supersequence is {}"
      .format(superSeq(X,Y,len(X),len(Y),lookup)))
 
# This code is contributed by Tanmay Ambadkar

输出:

Length of the shortest supersequence is 9.0