1.首先感谢的帖子,需要可以看这连个贴子,讲的非常细
https://www.cnblogs.com/c-cloud/p/3224788.html
https://www.cnblogs.com/zhangtianq/p/5839909.html
2.取其精华
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/************************************************************
Copyright (C)2019.
FileName: KMP.c
Author: zjl
Date:2019.6
Description:KMP匹配算法
Version: V1.0
Function List:
1.void makeNext()
2.
History: // 历史修改记录
<author> <time> <version > <desc>
***********************************************************/
/**********************************************************
* 函数名:void makeNext(const char p[],int next[])
* 函数功能:实现next数组
* 函数入参数:const char p[]【模板字符串】,int next[]【存放最大前缀的前缀的长度】
* 返回值:NONE
* 说明:next主要负责吧模式字符串向前移动,移动的位数为:失配字符所在位置-失配字符对应的next值
* 这里失配的next值就是,就是前后缀匹配的长度
* ********************************************************/
void makeNext(const char P[],int next[])
{
int q,k; //q:模板字符串的下标,k:最大前后缀的长度
int m=strlen(P);//模板字符串的长度
next[0]=0;//模板字符串的第一个字符发的最大前后缀长度为0;
for(q=1,k=0;q<m;++q)//for循环,从第二个字符开始,依次计算每一个字符对应的next值
{
while(k>0&&P[q]!=P[k])
k=next[k-1];//k=j
if(P[q]==P[k])//如果相等,那么最大向的前后缀就会加1
{
k++;
}
next[q]=k;
}
}
/**********************************************************
* 函数名:int KMP(const char T[],const char P[],int next[])
* 函数功能:实现KMP
* 函数入参数:const chat=r T[]【待匹配的字符串】,const char p[]【模板字符串】,int next[]【存放最大前缀的前缀的长度】
* 返回值:int
* 说明:
* ********************************************************/
int KMP(const char T[],const char P[],int next[])
{
int n,m; /*分别为T,P的长度*/
int i,q;//分别为T,P的下标、
n=strlen(T);
m=strlen(P);
makeNext(P,next);
for(i=0,q=0;i<n;++i)
{
while(q>0&&P[q]!=T[i])
{
q=next[q-1];
if(P[q]==T[i])
{
q++;
}
if(q==m)//输出找到的位置
{
printf("Patttern occurs with shift:%d\n",(i-m+1));
}
}
}
}
int main(void)
{
int i;
int next[100]={0};
char T[20]="abcdefdfgssadsafd";
char P[2]="cde";
KMP(T,P,next);
for(i=0;i<strlen(P);++i)
{
printf("%d",next[i]);
}
printf("\n");
printf("hello");
system("pause");
return 0;
}