最长公共子序列问题c++代码并说解题思路
时间: 2023-11-06 11:05:45 浏览: 37
最长公共子序列问题可以通过动态规划算法来解决。
定义一个二维数组 `dp`,其中 `dp[i][j]` 表示字符串 `s1` 的前 `i` 个字符和字符串 `s2` 的前 `j` 个字符的最长公共子序列的长度。
状态转移方程如下:
当 `s1[i-1] == s2[j-1]` 时,说明当前字符可以作为最长公共子序列的一部分,因此 `dp[i][j] = dp[i-1][j-1] + 1`。
当 `s1[i-1] != s2[j-1]` 时,说明当前字符不能作为最长公共子序列的一部分,因此需要去掉 `s1` 的最后一个字符或者去掉 `s2` 的最后一个字符,取它们的最大值,即 `dp[i][j] = max(dp[i-1][j], dp[i][j-1])`。
最终结果为 `dp[m][n]`,其中 `m` 和 `n` 分别为字符串 `s1` 和 `s2` 的长度。
以下是 C++ 代码实现:
```cpp
#include <iostream>
#include <cstring>
using namespace std;
int longest_common_subsequence(string s1, string s2) {
int m = s1.length();
int n = s2.length();
int dp[m+1][n+1];
memset(dp, 0, sizeof(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]);
}
}
}
return dp[m][n];
}
int main() {
string s1 = "abcde";
string s2 = "ace";
int result = longest_common_subsequence(s1, s2);
cout << result << endl; // 输出 3
return 0;
}
```
需要注意的是,在 C++ 中需要包含头文件 `<cstring>` 来使用 `memset` 函数。