kmp

来源:互联网 发布:linux expr 编辑:程序博客网 时间:2024/05/16 14:41

假设要在字符串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];        }    }}

感觉这样思考,比算法导论上要简单些。


原创粉丝点击