kmp.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void GetNextValue(int *next, char *T, int len)
{
next[0] = -1;
int k = -1;
for (int q = 1; q <= len; q++)
{
while (k > -1 && T[k+1] != T[q]) {
k = next[k];
}
if (T[k+1] == T[q]) {
k = k+1;
}
next[q] = k;
}
return;
}
int KMP(char *s, int len, char *p, int plen)
{
int *next = (int *)malloc(sizeof(int) * plen);
GetNextValue(next, p, plen);
int k = -1;
int i = 0;
for (; i < len; i++) {
while (k > -1 && p[k+1]!=s[i]) {
k = next[k];
}
if(p[k+1] == s[i]) {
k++;
}
if (k == plen-1) {
return i-plen+1;
}
}
return -1;
}
main.c
#include "KMP.c"
int main(void)
{
char s[512] = "jongmoshufa";
char t[100] = "shufa";
int next[100];
int ret = KMP(s, strlen(s), t, strlen(t));
if(ret == -1) {
printf("match failed.\n");
} else {
printf("match success at positon [%d]\n", ret);
}
return 0;
}