//最长公共子序列(Longest Common Subsequence): 给定两个字符串,找出它们的最长公共子序列(不要求连续)。
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
string longestCommonSubsequence(string s1, string s2) {
int m = s1.length();
int n = s2.length();
// 创建二维数组dp,用于存储最长公共子序列的长度
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
// 填充dp数组
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
if (s1[i - 1] == s2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
}
else {
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
// 构造最长公共子序列
string result = "";
int i = m, j = n;
while (i > 0 && j > 0) {
if (s1[i - 1] == s2[j - 1]) {
result = s1[i - 1] + result;
i--;
j--;
}
else if (dp[i - 1][j] > dp[i][j - 1]) {
i--;
}
else {
j--;
}
}
return result;
}
int main() {
string s1 = "ABCBDAB";
string s2 = "BDCAB";
cout << "Longest Common Subsequence: " << longestCommonSubsequence(s1, s2) << endl;
return 0;
}
本文介绍了如何使用C++编程语言实现最长公共子序列(LCS)算法,通过动态规划方法计算两个字符串之间的最长相同子序列,示例中以字符串ABCBDAB和BDCAB为例输出结果。
1万+

被折叠的 条评论
为什么被折叠?



