解决最长公共子序列问题。输入的字符串可以利用随机数生成器随机产生,运行程序,记录对长度为一千、一万、十万的字符串,查找公共子序列所用的时间,列出表格显示。并单独显示一个长度为一百的字符串查找最长公共子序列的结果。C语言
时间: 2024-03-24 15:40:28 浏览: 54
好的,我来解答您的问题。
最长公共子序列(Longest Common Subsequence,LCS)指的是两个或多个序列中都存在的最长子序列(不要求连续)。
以下是 C 语言的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX_LEN 100000
int max(int a, int b) {
return a > b ? a : b;
}
int lcs(char *str1, char *str2, int len1, int len2) {
int dp[len1 + 1][len2 + 1];
for(int i = 0; i <= len1; i++) {
for(int j = 0; j <= len2; j++) {
if(i == 0 || j == 0) {
dp[i][j] = 0;
} else 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(NULL));
char str1[MAX_LEN], str2[MAX_LEN];
int len1, len2, common_len;
// 生成长度为100的随机字符串
len1 = 100;
len2 = 100;
for(int i = 0; i < len1; i++) {
str1[i] = rand() % 26 + 'a';
}
for(int i = 0; i < len2; i++) {
str2[i] = rand() % 26 + 'a';
}
common_len = lcs(str1, str2, len1, len2);
printf("长度为100的随机字符串的最长公共子序列长度为:%d\n", common_len);
// 生成长度为1000的随机字符串
len1 = 1000;
len2 = 1000;
for(int i = 0; i < len1; i++) {
str1[i] = rand() % 26 + 'a';
}
for(int i = 0; i < len2; i++) {
str2[i] = rand() % 26 + 'a';
}
clock_t start = clock();
common_len = lcs(str1, str2, len1, len2);
clock_t end = clock();
printf("长度为1000的随机字符串的最长公共子序列长度为:%d,用时:%lf秒\n", common_len, (double)(end - start) / CLOCKS_PER_SEC);
// 生成长度为10000的随机字符串
len1 = 10000;
len2 = 10000;
for(int i = 0; i < len1; i++) {
str1[i] = rand() % 26 + 'a';
}
for(int i = 0; i < len2; i++) {
str2[i] = rand() % 26 + 'a';
}
start = clock();
common_len = lcs(str1, str2, len1, len2);
end = clock();
printf("长度为10000的随机字符串的最长公共子序列长度为:%d,用时:%lf秒\n", common_len, (double)(end - start) / CLOCKS_PER_SEC);
// 生成长度为100000的随机字符串
len1 = 100000;
len2 = 100000;
for(int i = 0; i < len1; i++) {
str1[i] = rand() % 26 + 'a';
}
for(int i = 0; i < len2; i++) {
str2[i] = rand() % 26 + 'a';
}
start = clock();
common_len = lcs(str1, str2, len1, len2);
end = clock();
printf("长度为100000的随机字符串的最长公共子序列长度为:%d,用时:%lf秒\n", common_len, (double)(end - start) / CLOCKS_PER_SEC);
return 0;
}
```
上述代码会生成长度为 100、1000、10000、100000 的随机字符串,并计算出它们的最长公共子序列的长度及用时,并输出到控制台。
注意:生成的随机字符串只包含小写字母。
希望我的回答对您有帮助!
阅读全文