用C语言实现串的KMP算法
时间: 2024-05-08 22:17:37 浏览: 99
下面是C语言实现串的KMP算法的完整代码:
```c
#include <stdio.h>
#include <string.h>
void computeLPSArray(char* pat, int M, int* lps);
void KMPSearch(char* pat, char* txt)
{
int M = strlen(pat);
int N = strlen(txt);
int lps[M];
computeLPSArray(pat, M, lps);
int i = 0;
int j = 0;
while (i < N) {
if (pat[j] == txt[i]) {
j++;
i++;
}
if (j == M) {
printf("Found pattern at index %d\n", i - j);
j = lps[j - 1];
}
else if (i < N && pat[j] != txt[i]) {
if (j != 0)
j = lps[j - 1];
else
i = i + 1;
}
}
}
void computeLPSArray(char* pat, int M, int* lps)
{
int len = 0;
lps[0] = 0;
int i = 1;
while (i < M) {
if (pat[i] == pat[len]) {
len++;
lps[i] = len;
i++;
}
else {
if (len != 0) {
len = lps[len - 1];
}
else {
lps[i] = 0;
i++;
}
}
}
}
int main()
{
char txt[] = "ABABDABACDABABCABAB";
char pat[] = "ABABCABAB";
KMPSearch(pat, txt);
return 0;
}
```
首先,在`computeLPSArray`函数中,我们计算并返回一个LPS(最长公共前缀和后缀)数组。然后,在`KMPSearch`函数中,我们使用计算出的LPS数组来执行KMP搜索。
在主函数中,我们定义了一个文本字符串`txt`和一个模式字符串`pat`,然后调用`KMPSearch`函数来在文本字符串中查找模式字符串。
请注意,此代码假定模式字符串和文本字符串都是ASCII字符串。如果你要处理Unicode字符串,请使用适当的函数替换`strlen`和字符串比较函数。
阅读全文