首先需要找到一个next数组
next数组
程序:
void findnext(char* t,int* next)
{
int cnt=0;
int m=strlen(t);
int i=0;
int j=-1;
next[0]=-1;
while(i<m)
{
while(j>=0&&t[i]!=t[j])
j=next[j];
i++;
j++;
next[i]=j;
}
}
理解:这个next数组程序,是根据KMP算法小结
计算匹配数目:
int kmpcount(char* s,char* t)
{
int next[20];
int cnt=0;
findnext(t,next);
for(int index=0; index<strlen(s); index++)
{
int j=0;
int i=index;
while(j<strlen(t)&&i<strlen(s))
{
if(j==-1||t[j]==s[i])
{
i++;
j++;
}
else
j=next[j];
}
//printf("j: %2d i: %2d index:%2d\n",j,i,index);
if(j==strlen(t)&&(i-index)==strlen(t))
cnt++;
}
return cnt;
}
注释:其中,if语句为应用公式推导出来的,数据来源为if语句以上的注释部分,通过数据对比得出结论。
这个我本身说的太过简略,还要参考大神们的文章啊。。。