用C++写出X和Y的最长公共子序列,X和Y两个序列由用户输入
时间: 2024-10-13 08:13:52 浏览: 37
在C++中,我们可以使用动态规划算法来解决这个问题。最长公共子序列(Longest Common Subsequence, LCS)是指两个序列中最长的相同子序列,而不考虑它们在原序列中的相对位置。下面是一个简单的实现:
```cpp
#include <iostream>
#include <vector>
std::string longestCommonSubsequence(std::string X, std::string Y) {
int m = X.size(), n = Y.size();
std::vector<std::vector<int>> dp(m + 1, std::vector<int>(n + 1, 0));
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
if (X[i - 1] == Y[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
dp[i][j] = std::max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
// 从dp数组构建LCS字符串
std::string lcs = "";
int i = m, j = n;
while (i > 0 && j > 0) {
if (X[i - 1] == Y[j - 1]) {
lcs += X[i - 1];
i--;
j--;
} else if (dp[i - 1][j] > dp[i][j - 1]) {
i--;
} else {
j--;
}
}
return lcs;
}
int main() {
std::cout << "请输入第一个序列 X: ";
std::string X;
std::getline(std::cin, X);
std::cout << "请输入第二个序列 Y: ";
std::string Y;
std::getline(std::cin, Y);
std::string result = longestCommonSubsequence(X, Y);
std::cout << "最长公共子序列为: " << result << "\n";
return 0;
}
```
这个程序首先初始化一个二维数组`dp`用于存储子问题的解,然后通过两层循环计算出所有子问题的最长公共子序列长度。最后,通过回溯`dp`数组找到实际的子序列。
阅读全文