以字典序打印 C++ 中所有最长公共子序列
在这个问题中,我们给出了两个字符串 str1 和 str2。我们的任务是创建一个程序来以字典序打印所有最长公共子序列。
让我们通过一个示例来理解问题,
输入:str1 = “gfare” , str2 = “rfare”
输出:fare
解决方案思路
在这个问题中,我们将使用动态规划找到所有可能的公共子序列,并将它们存储在一个二维矩阵中。在此之后,我们将通过在 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
广告