最长公共子上升序列(LCS)是一个经典的字符串匹配问题,用于到两个字符串中最长的公共子序列。下面是一个用 C++ 实现的最长公共子上升序列算法:
```cpp
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int LCS(string s1, string s2) {
// 计算两个字符串的长度
int m = s1.length();
int n = s2.length();
// 创建一个二维数组 dp,用于存储最长公共子序列的长度
字符串长度问题 vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
// 初始化最长公共子序列的长度为 0
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 length = LCS(s1, s2);
cout << "最长公共子上升序列的长度为:" << length << endl;
return 0;
}
```
这个算法的时间复杂度为 O(mn),其中 m 和 n 分别是两个字符串的长度。它通过动态规划的方法来计算最长公共子序列的长度。在每次迭代中,它比较当前字符是否相同,如果相同,则最长公共子序列的长度增加 1,否则选择两个子问题中较大的一个作为当前问题的解。
请注意,这个算法计算的是最长公共子上升序列,而不是最长公共子序列。如果你需要计算最长公共子序列,可以将比较条件从 `s1[i - 1] == s2[j - 1]` 改为 `s1[i - 1] == s2[j - 1] || dp[i - 1][j - 1] > 0`。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论