#include<stdio.h>
#include<stdlib.h>
int* make_next(int pa[],int pn)
{
int* next=(int*)malloc(sizeof(int)*pn);
next[0]=-1;
int j=0;
int k=-1;
while(j<pn-1){
if(k==-1||pa[j]==pa[k]){
j++;
k++;
next[j]=k;
}
else
k=next[k];
}
return next;
}
int find(int da[],int an,int pa[],int pn)
{
int rst=-1;
int* next=make_next(pa,pn);
int i=0;
int j=0;
int n=0;
while(j<an){
n++;
if(da[i]==pa[j]||j==-1){
i++;
j++;
}
else
j=next[j];
if(j==pn)
{
rst=i-pn;
break;
}
}
free(next);
return rst;
}
int main()
{
int da[]={1,2,1,2,1,1,2,1,2,1,1,2,1,1,2,1,1,2,1,2,1,1,2,1,1,2,1,1,1,2,1,2,3};
int pa[]={1,2,1,1,2,1,1,1,2};
int n=find(da,sizeof(da)/sizeof(int),pa,sizeof(pa)/sizeof(int));
printf("%d\n",n);
第五届第三题 信号匹配 KMP算法
最新推荐文章于 2021-03-17 08:49:44 发布
本文介绍了KMP算法在串匹配中的应用,详细解析了如何创建next数组,并通过实例解释了next数组的生成规则,强调了next数组在失配时的角色。通过分析,展示了KMP算法的时间复杂度为O(n+m),并提到了在特定题目中的应用。
摘要由CSDN通过智能技术生成