以下是大二时为了备考“程序员”对KMP算法的总结,当时在我的sina博客上写的。
若p[k]=p[j],说明p[0]~p[k]=p[j-k]~p[j]成立,则有next[j+1]=k+1。
若p[k]!=p[j],即p[0]~p[k-1]!=p[j-k]~p[j-1],从KMP算法的角度来看,这时应p[j]应该跟p[next[k]]进行比较。也就是k=next[k],如此重复,由于next[k]<k,故最终必然是k=-1或p[k]=p[j]。如果是k=-1,则next[j+1]=0,否则next[j+1]=k+1,可以统一为next[j+1]=k+1。
(在红字部分徘徊了几乎一整天,最后终于弄明白了)
3.if条件语句里面可改进为{++i;++j;
if(p[i]!=p[j])next[i]=j;
else next[i]=next[j];
}
这个还未完全搞明白,好像可以避免字符重复的情况。
然后是主串和模式串匹配的算法:
int Index_KMP(char *s,char *p,int pos,int next[]){
/*用模式串p的next函数,求其在主串s中从pos个字符开始后*/
/*的位置*/
i=pos-1;j=-1;
slen=strlen(s);
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-plen;
else return -1;
}