在C ++中按字典顺序打印所有最长的公共子序列

在此问题中,我们给了两个字符串str1和str2。我们的任务是创建一个程序,以按字典顺序打印所有最长的公共子序列。 

让我们举个例子来了解这个问题, 

输入:  str1 =“ gfare”,str2 =“ rfare”

输出: 票价

解决方法

在这个问题中,我们将找到所有可能的最长公共子序列,并使用动态编程将它们存储在2D矩阵中。此后,我们将通过在LCS中搜索从a到z的字符来打印排序的输出

该程序说明了我们解决方案的工作原理,

示例

#include<iostream>

#include<cstring>

#define MAX 100

using namespace std;

int LCSLength = 0;

int DP[MAX][MAX];

int calcLCSLenght(string str1, string str2, int l1, int l2, int i, int j) {

   

   int &lcsLen = DP[i][j];

   if (i==l1 || j==l2)

      return lcsLen = 0;

   if (lcsLen != -1)

      return lcsLen;

   lcsLen = 0;

   

   if (str1[i] == str2[j])

      lcsLen = 1 + calcLCSLenght(str1, str2, l1, l2, i+1, j+1);

   else

      lcsLen = max(calcLCSLenght(str1, str2, l1, l2, i+1, j), calcLCSLenght(str1, str2, l1, l2, i, j+1));

   return lcsLen;

}

void printAllLCS(string str1, string str2, int l1, int l2, char data[], int index1, int index2, int currentLCSlength) {

   if (currentLCSlength == LCSLength) {

     

      data[currentLCSlength] = '\0';

      puts(data);

      return;

   }

   if (index1==l1 || index2==l2)

      return;

   for (char ch='a'; ch<='z'; ch++) {

     

      bool done = false;

      for (int i=index1; i<l1; i++) {

         if (ch==str1[i]) {

            for (int j=index2; j<l2; j++) {

               if (ch==str2[j] && calcLCSLenght(str1, str2, l1, l2, i, j) == LCSLength-currentLCSlength) {

                  data[currentLCSlength] = ch;

                  printAllLCS(str1, str2, l1, l2, data, i+1, j+1, currentLCSlength+1);

                  done = true;

                  break;

               }

            }

         }

         if (done)

            break;

      }

   }

}

int main() {

   

   string str1 = "xysxysx", str2 = "xsyxsyx";

   

   int l1 = str1.length(), l2 = str2.length();

   memset(DP, -1, sizeof(DP));

   LCSLength = calcLCSLenght(str1, str2, l1, l2, 0, 0);

   char data[MAX];

   cout<<"All longest common sub-sequences in lexicographical order are\n";

   printAllLCS(str1, str2, l1, l2, data, 0, 0, 0);

   return 0;

}

输出结果
All longest common sub-sequences in lexicographical order are

xsxsx

xsxyx

xsysx

xysyx

xyxsx

xyxyx

以上是 在C ++中按字典顺序打印所有最长的公共子序列 的全部内容, 来源链接: utcz.com/z/351178.html

回到顶部