解决最长公共子序列问题。输入的字符串可以利用随机数生成器随机产生,运行程序,记录对长度为一千、一万、十万的字符串,查找公共子序列所用的时间,列出表格显示。并单独显示一个长度为一百的字符串查找最长公共子序列的结果。用C++解决
时间: 2024-02-25 17:56:00 浏览: 110
C语言求解最长公共子字符串问题及相关的算法分析
5星 · 资源好评率100%
好的,这是一个经典的算法问题,我会编写一个 C++ 程序解决最长公共子序列问题。以下是代码实现和注释:
```cpp
#include <iostream>
#include <cstring>
#include <ctime>
using namespace std;
const int MAX_LEN = 1e5;
// 生成随机字符串
void generateRandomString(char* str, int len) {
for (int i = 0; i < len; i++) {
str[i] = 'a' + rand() % 26;
}
}
// 求两个字符串的最长公共子序列
int longestCommonSubsequence(char* str1, int len1, char* str2, int len2) {
int dp[MAX_LEN + 1][MAX_LEN + 1];
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
if (str1[i - 1] == str2[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[len1][len2];
}
int main() {
srand(time(nullptr));
// 计算长度为 100 的字符串的最长公共子序列
char str1[101] = "abcde";
char str2[101] = "ace";
int len1 = strlen(str1);
int len2 = strlen(str2);
int lcs = longestCommonSubsequence(str1, len1, str2, len2);
cout << "The longest common subsequence of " << str1 << " and " << str2 << " is " << lcs << endl;
// 计算长度为 1000、10000、100000 的字符串查找公共子序列所用的时间
int len[3] = {1000, 10000, 100000};
for (int i = 0; i < 3; i++) {
char str1[MAX_LEN];
char str2[MAX_LEN];
generateRandomString(str1, len[i]);
generateRandomString(str2, len[i]);
clock_t start = clock();
int lcs = longestCommonSubsequence(str1, len[i], str2, len[i]);
clock_t end = clock();
double duration = (double)(end - start) / CLOCKS_PER_SEC;
cout << "The longest common subsequence of two random strings with length " << len[i] << " is " << lcs << ", and it takes " << duration << " seconds to calculate." << endl;
}
return 0;
}
```
注:以上代码中使用了随机数生成器生成随机字符串,使用了 `clock()` 函数计算程序运行时间,建议在 Linux 或 macOS 系统下编译运行此程序。
阅读全文