#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void GetNext(const char *sub, int *next)
{
int slen = strlen(sub);
int k = 0;
next[0] = 0;
for (int i = 1; i < slen; ++i)
{
while (k > 0 && sub[i] != sub[k])
k = next[k-1];
if (sub[i] == sub[k])
k++;
next[i] = k;
}
}
int KmpSearch(const char *src, const char *sub)
{
int k = 0;
int n, m;
n = strlen(src);
m = strlen(sub);
int *next = (int *)malloc(sizeof(int)*m);
GetNext(sub, next);
for (int i = 0; i < n; ++i)
{
while (k > 0 && src[i] != sub[k])
k = next[k-1];
if (src[i] == sub[k])
k++;
if (k == m)
{
delete [] next;
return (i - m + 1);
}
}
delete [] next;
return -1;
}
int main()
{
char src[] = "ABCDEABDE";
char sub[] = "ABD";
printf("%s中,第一次出现%s子串的下标为:%d\n", src, sub, KmpSearch(src, sub));
return 0;
}
10-14
392
