在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
热门推荐
10 朋友新年祝福语大全 简短
11 新年祝福语简短大方兔年
12 搬新家礼物祝福语简短
13 同学见面花束祝福语简短
14 五一假期祝福语幽默简短
15 离职欢送敬酒祝福语简短
16 对学弟的祝福语简短
17 考老师辞职祝福语简短
18 祝福语驱散霉运的话简短