KMP算法实现
#include <stdio.h>
#include <stdlib.h>
void buildNext(int* next, char* s2, int len2)
{
int i=0;
int j=-1;
next[0] = -1;
while(i<len2-1)
{
if(j==-1 || s2[i] == s2[j])
{
i++;
j++;
if(s2[i] != s2[j]) next[i] = j;
else next[i]=next[j];
}
else
{
j = next[j];
}
}
}
int KMP(char* s1, int len1, char* s2, int len2)
{
int i=0;
int j=0;
int* next = (int*)malloc(len2*sizeof(int));
buildNext(next,s2,len2);
while(i<len1 && j<len2)
{
if(j==-1 || s1[i] == s2[j])
{
i++;
j++;
}
else
{
j = next[j];
}
}
free(next);
if(j>=len2) return i-len2;
else return -1;
}
int main()
{
char s1[7] = {"aabaaab"};
char s2[4] = {"ab"};
int len1 = 7;
int len2 = 2;
int rtn;
rtn = KMP(s1, len1, s2, len2);
printf("%d", rtn);
return 0;
}