两篇讲的比较好的博客,结合起来看
http://www.cnblogs.com/tangzhengyue/p/4315393.html
http://www.cnblogs.com/yjiyjige/p/3263858.html
#include<stdio.h>
#include<string.h>
int next[20];
char textstr[20],keystr[20];
void getnext()
{
int key_len=strlen(keystr);
next[0]=-1;
int k=-1;
for(int j=0;j<key_len-1;j++)
{
if(keystr[k]==keystr[j]||k==-1)
next[j+1]=++k;
else
k=next[k];
}
}
int KMP()
{
int text_len=strlen(textstr);
int key_len=strlen(keystr);
int i=0,j=0;
while(i<text_len&&j<key_len)
{
if(textstr[i]==keystr[j]||j==-1) //当j为-1时,要移动的是i,当然j也要归0
{
i++;
j++;
}
else
j=next[j];
}
if(j==key_len)
return i-j;
else
return -1;
}
int main()
{
strcpy(textstr,"baacaab");
strcpy(keystr,"ca");
getnext();
printf("%d",KMP());
return 0;
}