C语言求两字符串的所有公共子串
时间: 2024-10-27 20:08:33 浏览: 33
在C语言中,求两个字符串的所有公共子串通常可以使用动态规划的方法来实现,比如KMP算法或Boyer-Moore算法。其中,KMP算法(Knuth-Morris-Pratt算法)相对简单一些,它主要用于查找文本串中模式串首次出现的位置,但是通过稍作修改,也可以用于找到两个字符串之间的所有共同子串。
下面是一个简单的KMP算法示例,用于寻找两个字符串的所有公共子串:
```c
#include <stdio.h>
#include <string.h>
// KMP表生成函数
void compute_lps(char *pattern, int lps[], int len) {
int index = 0, j;
lps[0] = 0;
for (int i = 1; i < len; i++) {
if (pattern[i] == pattern[index])
index++;
else {
if (index != 0)
index = lps[index - 1];
else
lps[i] = 0;
}
lps[i] = index;
}
}
// 找到公共子串的函数
void find_common_substrings(char str1[], char str2[], int m, int n, int lps[]) {
int i = 0, j = 0;
while (i < m && j < n) {
if (str1[i] == str2[j]) {
printf("%s ", str1 + i);
i++;
j++;
}
else if (j != 0)
j = lps[j - 1];
else
i++;
}
printf("\n");
}
int main() {
char str1[] = "ABCDGH";
char str2[] = "AEDFHR";
int m = strlen(str1);
int n = strlen(str2);
int lps[str2.length];
compute_lps(str2, lps, n);
printf("Common substrings are:\n");
find_common_substrings(str1, str2, m, n, lps);
return 0;
}
```
在这个例子中,`compute_lps`函数计算了第二个字符串的最长公共前后缀数组(LPS),`find_common_substrings`函数则根据LPS数组找出两个字符串的公共子串。
阅读全文