给我kmp算法的代码c语言版本
时间: 2024-10-04 13:02:00 浏览: 30
KMP算法的C语言实现通常包含以下几个关键部分:
```c
#include <stdio.h>
#include <string.h>
// 创建部分匹配表
void compute_prefix_table(char pattern[], int prefix[], int n) {
prefix[0] = -1; // 初始化第一个元素为-1表示前一个位置无法确定
int j = -1;
for (int i = 1; i < n; ++i) {
while (j != -1 && pattern[i] != pattern[j + 1]) {
j = prefix[j];
}
if (pattern[i] == pattern[j + 1]) {
j++;
}
prefix[i] = j;
}
}
// 使用部分匹配表进行KMP匹配
int kmp_search(char text[], char pattern[], int m, int n) {
int i = 0, j = 0;
while (i < n && j < m) {
if (text[i] == pattern[j]) {
i++, j++;
} else {
if (j != 0)
j = prefix[j - 1]; // 根据部分匹配表跳转
else
i++; // 未匹配到,尝试下一个字符
}
}
if (j == m) return i - j; // 成功匹配,返回起始位置
return -1; // 未找到匹配
}
int main() {
char pattern[] = "ABABCAB";
char text[] = "BABABCAB";
int n = strlen(pattern);
int m = strlen(text);
int prefix[n];
compute_prefix_table(pattern, prefix, n);
printf("Pattern found at index %d\n", kmp_search(text, pattern, m, n));
return 0;
}
```
这个代码首先计算部分匹配表`prefix[]`,然后在`main()`函数中利用这个表进行字符串搜索。当遇到不匹配的情况,会根据`prefix[]`调整模式串的指针。请注意,这个例子假设文本字符串`text`大于等于模式字符串`pattern`。
阅读全文