编写一个c语言程序完成以下要求: 实现两个字符串的最长公共子序列和最长公共子串的输出。 要求: (1) 输入两个字符串(长度范围1-100;1-1000;1-10000),长字符串时可以从文件中读取。 (2) 分别输出其最长公共子序列和最长公共子串。
时间: 2024-10-16 10:07:50 浏览: 29
要编写一个C语言程序来实现这两个功能,你需要使用动态规划(Dynamic Programming)算法来计算最长公共子序列(LCS),而最长公共子串则可以利用滑动窗口或者双指针法来寻找。这里是一个简单的示例,展示如何分别计算最长公共子序列和最长公共子串:
```c
#include <stdio.h>
#include <string.h>
// 函数声明
int lcs(char *str1, char *str2);
void longest_common_substring(char *str1, char *str2);
int main() {
char str1[1001], str2[1001];
FILE *file1 = NULL, *file2 = NULL;
// 从文件读取输入 (假设文件名分别为input1.txt和input2.txt)
if ((file1 = fopen("input1.txt", "r")) && (file2 = fopen("input2.txt", "r"))) {
fgets(str1, sizeof(str1), file1);
fgets(str2, sizeof(str2), file2);
fclose(file1);
fclose(file2);
} else {
printf("Please provide the strings directly or input them from files.\n");
return 1;
}
int lcs_len = lcs(str1, str2);
printf("Length of the Longest Common Subsequence: %d\n", lcs_len);
longest_common_substring(str1, str2);
return 0;
}
// 最长公共子序列函数 (这里仅提供算法框架,实际应用需要更详细的代码)
int lcs(char *str1, char *str2) {
int m = strlen(str1);
int n = strlen(str2);
int dp[m + 1][n + 1];
for (int i = 0; i <= m; i++) {
for (int j = 0; j <= n; 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[m][n];
}
// 最长公共子串函数 (滑动窗口法)
void longest_common_substring(char *str1, char *str2) {
int len1 = strlen(str1), len2 = strlen(str2);
int maxLength = 0, endingIndex = 0;
for(int i = 0; i < len1; i++) {
int j, k;
for(j = i, k = 0; j < len1 && k < len2 && str1[j] == str2[k]; j++, k++) {
if(k > maxLength) {
maxLength = k;
endingIndex = j;
}
}
}
printf("Longest Common Substring: ");
for(int i = endingIndex - maxLength + 1; i <= endingIndex; i++)
printf("%c", str1[i]);
printf("\n");
}
```
阅读全文