1、推荐阮一峰的博客,通俗易懂。(直接点进去看)
2、理解next数组
3、理解前缀和后缀
代码模板:
#include <stdio.h>
#include <string.h>
char a[1000000],b[1000000];//a是文本串,b是模式串
int next[1000000];//期待的next数组
int main()
{
int i,j,k;
gets(a+1);
gets(b+1);//输入
int L1=strlen(a+1); //计算长度
int L2=strlen(b+1);
//int next[1000000];
next[0]=-1;//首位赋值-1
for(i=1;i<=L2;i++)//遍历一遍
{
k=next[i-1];//k初值是-1 ,第二次是0,
while(k!=-1&&b[k+1]!=b[i]) //当k不是-1并且 b[1]!=b[2]此处判断k是否为-1的原因在于,如果回跳到第一个字符就不用再回跳了
k=next[k];//若 b[1]!=b[2],k=next[0]=-1, 通过自己匹配自己来得出每一个点的next值
next[i]=k+1;//next[1]=0, next[2]=
}
for(i=0;i<=L1;i++)
{
j=0;//j可以看做表示当前已经匹配完的模式串的最后一位的位置,也可以理解为j表示模式串匹配到第几位了
if(j==L2) printf("%d\n",i-L2+1);
while(j&&a[i+1]!=b[j+1]) j=next[j];//如果失配 ,那么就不断向回跳,直到可以继续匹配
if(a[i+1]==b[j+1]) j++;//如果匹配成功,那么对应的模式串位置++
}
return 0;
}
时间复杂度:Θ(m+n)
每次位置指针i++时,失配指针jj至多增加一次,所以jj至多增加len次,从而至多减少len次,所以就是\Theta(len_N + len_M) ==Θ(N+M)的
4287



被折叠的 条评论
为什么被折叠?



