C++中怎么求两个序列的LCS,讲解一下
时间: 2024-03-20 14:39:59 浏览: 37
算法-最长公共子序列-LCS
3星 · 编辑精心推荐
LCS是最长公共子序列(Longest Common Subsequence)的缩写。给定两个序列,求它们的最长公共子序列,即在两个序列中以相同顺序出现的最长子序列。
以下是一个求解两个序列的LCS的C++算法:
1. 定义一个二维数组 `dp`,其中 `dp[i][j]` 表示序列 A 的前 `i` 个字符和序列 B 的前 `j` 个字符的最长公共子序列的长度。
2. 初始化 `dp` 数组,将 `dp[0][j]` 和 `dp[i][0]` 均设为 0。
3. 遍历序列 A 和序列 B,当 A[i] 等于 B[j] 时,`dp[i][j]` 为 `dp[i-1][j-1]+1`;当 A[i] 不等于 B[j] 时,`dp[i][j]` 为 `max(dp[i-1][j], dp[i][j-1])`。
4. 最终 `dp[m][n]` 就是序列 A 和序列 B 的最长公共子序列的长度。
5. 可以通过 `dp` 数组来找到最长公共子序列。从 `dp[m][n]` 开始,如果 A[i] 等于 B[j],将 A[i] 加入结果中,然后向左上角移动一步,即 `i--` 和 `j--`;如果 A[i] 不等于 B[j],则向 `dp[i-1][j]` 或 `dp[i][j-1]` 中较大的一个方向移动。
下面是具体的C++代码实现:
```c++
int LCS(string A, string B) {
int m = A.size(), n = B.size();
vector<vector<int>> dp(m+1, vector<int>(n+1, 0));
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (A[i-1] == B[j-1]) {
dp[i][j] = dp[i-1][j-1] + 1;
} else {
dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
}
}
return dp[m][n];
}
```
注意,以上代码只求了最长公共子序列的长度,如果需要求具体的最长公共子序列,可以参考步骤5中的描述。
阅读全文