在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 arexsxsx
xsxyx
xsysx
xysyx
xyxsx
xyxyx
以上是 在C ++中按字典顺序打印所有最长的公共子序列 的全部内容, 来源链接: utcz.com/z/351178.html