假设要在字符串t中寻找s,那么next[i]=j 表示,如果s[i]与t[k]匹配失败,下次就让s[j]跟t[k]匹配。也就是说,其实在s中,s[i-1]==s[j-1], s[i-2]==s[j-2]。。。
这样,在计算next时,先找到与s[i]相等的那个位置j。然后,i++,j++,让next[i]=j。
void computeNext(char* s)
{
int i=0, j=-1;
next[0]=-1;
int len = strlen(s);
while(i<len)
{
while(j>=0 && s[i]!=s[j])
j=next[j];
i++;
j++;
next[i]=j;
}
}
在匹配时,
void kmp(char* s, char* t)
{
computeNext(s);
int len=strlen(t);
int end=strlen(s);
int i=0, j=0;
while(i<len)
{
while(j>=0&&t[i]!=s[j])
j=next[j];
i++;
j++;
if(j==end)
{
output(t, i-end, i);
j=next[j];
}
}
}
感觉这样思考,比算法导论上要简单些。