void lcsLength(string str1, string str2, vector< vector>& intV, vector< vector>& charV)
{
int str1Len = str1.size();
int str2Len = str2.size();
intV.resize(str1Len + 1);
charV.resize(str1Len + 1);
for (int i = 0; i < str1Len + 1; ++i)
{
intV[i].resize(str2Len + 1);
charV[i].resize(str2Len + 1);
}
for (int i = 1; i <= str1Len; ++i) {
for (int j = 1; j <= str2Len; ++j) {
if (str1[i - 1] == str2[j - 1]) {
intV[i][j] = intV[i - 1][j - 1] + 1;
charV[i][j] = ‘c’;
}
else if (intV[i - 1][j] >= intV[i][j - 1]) {
intV[i][j] = intV[i - 1][j];
charV[i][j] = ‘u’;
}
else {
intV[i][j] = intV[i][j - 1];
charV[i][j] = ‘l’;
}
}
}
cout << “subsequence length:” << intV[str1Len][str2Len] << endl;
}
void print_lcs(vector< vector>& charV, string str1, int i, int j)
{
if (i == 0 || j == 0)
return;
if (charV[i][j] == ‘c’) {
print_lcs(charV, str1, i - 1, j - 1);
cout << str1[i - 1];
}
else if (charV[i][j] == ‘u’)
print_lcs(charV, str1, i - 1, j);
else
print_lcs(charV, str1, i, j - 1);
}
int main()
{
string str1 = “didactdcal”;
string str2 = “advantage”;
vector< vector> intV;
vector< vector> charV;
lcsLength(str1, str2, intV, charV);
print_lcs(charV, str1, str1.size(), str2.size());
}
C++求两个字符串的最长子序列
最新推荐文章于 2024-05-22 13:31:32 发布
本文介绍了一种求解两个字符串最长公共子序列长度及具体子序列的方法。通过使用两个二维数组分别记录最长子序列的长度和方向,该算法能够递归地找到最长公共子序列。示例代码展示了如何对didactdcal和advantage两个字符串进行处理并输出结果。
摘要由CSDN通过智能技术生成