int *get_next(char *p){
int len=strlen(p);
int *next=(int*)malloc(len*sizeof(int));
next[0]=-1;
int i,j;
for(j=1;j<len;j++)
for(i=next[j-1];;i++)
if(p[j]==p[i+1]){
next[j]=i+1;
break;
}
else if(i==-1){
next[j]=-1;
break;
}
return next;
}
int kmp(char *t,char *p){
int *next=get_next(p);
int i,j;
int len_t=strlen(t);
int len_p=strlen(p);
for(i=0,j=0;i<len_t&&j<len_p;){
if(t[i]==p[j]){
i++;j++;
}
else if(j==0) i++;
else j=next[j-1]+1;
}
if(j==len_p) return i-len_p;
else return -1;
}
KMP(无回溯模式匹配)模板
最新推荐文章于 2023-05-27 21:59:37 发布