kmp的详细算法解析参见Matrix67的博文kmp详解
根据这个详解所写的kmp 的c语言实现:
#include <stdio.h>
#include<string.h>
#define max_n 4005
#define max_len 205
int len1,len2;
char str1[max_len],str2[max_len]; //str1为被匹配字符串,str2为pattern
char str[max_n][max_len];
int N;
int pre[max_len];
void next()
{
len1=strlen(str1);
len2=strlen(str2);
printf("%d %d\n",len1,len2);
int i,j=-1;
pre[0]=-1;
for(i=1;i<len2;i++)
{
while(j>=0&&str2[j+1]!=str2[i])
{
j=pre[j];
}
if(str2[j+1]==str2[i])
{
j++;
}
pre[i]=j;
}
}
void kmp()
{
int i,j=-1;
for(i=0;i<len1;i++)
{
while(j>=0&&str2[j+1]!=str1[i])
{
j=pre[j];
}
if(str2[j+1]==str1[i])
{
j++;
}
if(j==len2-1)
{
printf("pattern occurs with shift %d\n",i-len2+1);
j=pre[j];
}
}
}