详细解释
真的学一下发现思路也还是挺简单的
利用f数组求解
while (i<n)
{
if (A[i]==B[j])
{
i++;
j++;
if (j==m)
{
printf("%d\n",i-m+1);//注意,这里输出的位置是从1开始标号的,如果你要输出从0开始标号的位置,应该是是i-m.
j=F[j-1]+1;
}
}
else
{
if (j==0)
i++;
else
j=F[j-1]+1;
}
}
求解f数组
法一:
i=1;i<m;i++)
{
int j=F[i-1];
while ((B[j+1]!=B[i])&&(j>=0))
j=F[j];
if (B[j+1]==B[i])
F[i]=j+1;
else
F[i]=-1;
}
法二:
void getnext(char *a)
{
int len=strlen(a);
int i=0,j=-1;
next[0]=-1;
while(i<len)
{
if(j==-1||a[i]==a[j])
next[++i]=++j;
else j=next[j];
}
}