求最长公共子串c 语言
时间: 2024-11-28 19:21:37 浏览: 90
在C语言中,求两个字符串的最长公共子串(Longest Common Substring, LCS)通常可以使用动态规划(Dynamic Programming)方法来解决。最经典的算法之一是KMP算法(Knuth-Morris-Pratt算法),它可以在O(n + m)的时间复杂度内完成,其中n和m分别是输入字符串的长度。
以下是基本的KMP算法步骤:
1. **构建部分匹配表**(也叫失配函数或失败函数):这个表存储了模式串中每个位置的最大前缀和后缀相同字符的数量。通过比较模式串和当前搜索子串的对应字符,更新该值。
2. **遍历主串**:对于主串中的每一个字符,尝试在模式串中找到对应的字符。如果找到了,就向右移动;如果没有找到,就跳过等于或大于当前失配函数值的位置,继续搜索。
3. **记录最长公共子串**:每次成功匹配时,更新最长公共子串的长度和结束位置,同时跟踪最长的部分。
4. **返回结果**:当搜索完整个主串后,返回最长公共子串。
下面是KMP算法的伪代码:
```c
int getLPS(char pattern[], int M) {
int lps[M];
int len = 0;
int i = 1;
while (i < M) {
if (pattern[i] == pattern[len])
lps[i++] = ++len;
else {
if (len != 0)
len = lps[len - 1];
else
lps[i++] = 0;
}
}
return lps[M - 1];
}
void findLCS(char str1[], char str2[], int M, int N, char result[]) {
int lps = getLPS(str2, M);
int index = 0, i = 0, j = 0;
while (i < N && j < M) {
if (str1[i] == str2[j]) {
result[index++] = str1[i];
i++;
j++;
} else if (j != 0)
j = lps[j - 1];
else
i++;
}
result[index] = '\0';
}
```
阅读全文
相关推荐


















