c语言查找两个字符串的最长公共子串
时间: 2024-09-25 09:03:58 浏览: 36
在C语言中,查找两个字符串的最长公共子串可以使用动态规划算法,比如著名的KMP(Knuth-Morris-Pratt)算法或Rabin-Karp算法。其中,KMP算法是一种更为节省空间的方法。
KMP算法的基本思想是利用前缀函数(也叫部分匹配表),计算出模式串中的“坏字符”位置,避免了回溯过程中的无效比较。以下是使用KMP算法的一个简化的示例:
```c
#include <stdio.h>
#include <string.h>
// 计算前缀函数
void prefix_function(char* pattern) {
int len = strlen(pattern);
int prefix[len];
for (int i = 1, j = 0; i < len; ++i) {
while (j > 0 && pattern[i] != pattern[j])
j = prefix[j - 1];
if (pattern[i] == pattern[j])
j++;
prefix[i] = j;
}
}
// 查找最长公共子串
char* longest_common_substring(char* str1, char* str2) {
char* result = "";
int len1 = strlen(str1), len2 = strlen(str2);
prefix_function(str2);
int max_len = 0, end = -1;
for (int i = 0; i <= len1; ++i) {
while (str2[end + 1] != str1[i])
end = prefix[end];
if (str2[end + 1] == str1[i]) {
end++;
int curr_len = i + 1;
if (curr_len > max_len) {
max_len = curr_len;
result = (char*)malloc((max_len + 1) * sizeof(char));
memcpy(result, str1 + i - max_len + 1, max_len);
result[max_len] = '\0';
}
}
}
return result;
}
int main() {
char str1[] = "ABCDGH";
char str2[] = "AEDFHR";
printf("Longest common substring: %s\n", longest_common_substring(str1, str2));
free(result); // Don't forget to free the memory allocated for 'result'
return 0;
}
```
在这个例子中,`prefix_function`计算了`str2`的前缀函数,然后在`longest_common_substring`函数中,我们遍历`str1`,通过`prefix`找到`str2`的匹配部分,更新最长公共子串。
阅读全文