#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// 1、 写出一个字符串的前缀表
// 2、 讨论前缀表中的字符串的最短公共前后缀
// 3、 构造前缀表
// 4、 根据前缀表匹配字符串
void prefix_table(char pattern[], int prefix[], int n) {
prefix[0] = 0;
int len = 0;
int i = 1;
while (i < n) {
if (pattern[i] == pattern[len]) {
len ++;
prefix[i] = len;
i ++;
}
else {
if (len > 0) {
len = prefix[len - 1];
}
else {
prefix[i] = len;
i ++;
}
}
}
}
void move_prefix_table(int prefix[], int n) {
int i;
for (i = n; i > 0; i --) {
prefix[i] = prefix[i - 1];
}
prefix[0] = -1;
}
void kmp_search(char text[], char pattern[]) {
int n = strlen(pattern);
int m = strlen(text);
int* prefix = malloc(sizeof(int) * n);
prefix_table(pattern, prefix, n);
move_prefix_table(prefix, n);
// text[i] , len(text) = m
// pattern[j] , len(pattern) = n
int i = 0;
int j = 0;
while (i < m) {
if (j == n-1 && text[i] == pattern[j]) {
printf("Found pattern at %d\n", i - j);
j = prefix[j];
}
if (text[i] == pattern[j]) {
i ++;
j ++;
}
else {
j = prefix[j];
if (j == -1) {
i ++;
j ++;
}
}
}
}
int main() {
char pattern[] = "ABABCABAA";
char text[] = "ABABABCABAAABVABB";
kmp_search(text, pattern);
return 0;
}
C语言数据结构学习——KMP算法
最新推荐文章于 2022-06-22 00:28:23 发布