next[]数组求解函数如下:
void GetNext(char *p,int next[])
{
int pLen=strlen(p);
next[0]=-1;
int k=-1;
int j=0;
while(j<pLen-1)
{
if(k==-1||p[j]==p[k])
{
++k;
++j;
next[j]=k;
}
else
{
k=next[k];
}
}
}
这个函数中最让人费解的就是
k=next[k];
为什么匹配失败后k值要回溯到next[k]???
|___|k’ |___|K |___|k’ |___|j j+1
上面是我们的模式字符串p,其中前面的字符串部分 |___|k’ |___|和后面的
字符串部分 |___|k’ |___|是相等的;
代码告诉我们:如果K与j失配,可能再次满足匹配要求最大数只能是k’。
实际上,这是由next数组本身的性质决定的;
假设有k'与K之间的数字满足要求,那么next[K]的值将不是k',这显然是矛盾的
故直接将k值回溯到next[k]的做法是正确的。
因为本人画图水平堪忧,若不理解可进一步咨询
另附KMP主体算法如下:
int KmpSearch(char *s,char *p)
{
int i=0;
int j=0;
int sLen=strlen(s);
int pLen=strlen(p);
while(i<sLen&&j<pLen)
{
if(j==-1||s[i]==p[j])
{
i++;
j++;
}
else
{j=next[j];}
}
if(j==pLen)
return i-j;
else
return -1;
}