/*
*2018.08.30 12:35
*KMP算法
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//长度不包含空字符
typedef struct {
char *str;
int length;
}String;
void getNext(String *sub, int next[]);
int KMP(String *main, String *sub, int *next);
int main(void) {
String sub = {
"ababaaababaa",
12
};
int next[12];
getNext(&sub, next);
int i = 0;
for (i; i < sub.length; ++i) {
printf("%d ", next[i] + 1);
}
putchar('\n');
system("pause");
return 0;
}
//next的长度与sub的长度一样
void getNext(String *sub, int next[]) {
int i = 0, k = -1;
next[0] = -1;
while (i < sub->length) {
if (k == -1 || sub->str[i] == sub->str[k]) {
++i;
++k;
if (sub->str[i] == sub->str[k])
next[i] = next[k];
else next[i] = k;
}
else k = next[k];
}
}
int KMP(String *main, String *sub, int *next) {
int i = 0, j = -1;
while (i < main->length && j < sub->length) {
if (-1 == j || main->str[i] == sub->str[j]) {
++i;
++j;
}
else j = next[j];
}
if (j == sub->length)
return i - j;
return -1;
}
KMP算法
最新推荐文章于 2022-11-03 21:50:23 发布