Try Again

扩展KMP

参考资料https://segmentfault.com/a/1190000008663857

扩展KMP主要通过next数组以及extend数组,在模式串中找到所有与匹配串中完全匹配的段。

关于扩展KMP的思路,网上博客遍地开花,这里只是简单的记录一下模板。

void getnext(int next[],string t)
{
    int t_len=t.size();
    int next[0]=t_len;
    int a;
    int p;
    for(int i=1;j=-1;i<t_len;i++.j--)
    {
        if(j==-1 || i+next[i-a]>=p)
        {
            if(j<0) p=i,j=0;
            while(p<t_len && t[p]==t[j])
            {
                p++;
                j++;
            }
            next[i]=j;
            a=i;
        }
        else next[i]=next[i-a];
    }
}
void getextend(string s,string t,int extend[],int next[])
{
    getnext(next,t);
    int a;
    int p;
    int s_len=s.size();
    int t_len=t.size();
    for(int i=1,j=-1;i<s_len;i++,j--)
    {
        if(j==-1 || i+next[i-1]>=p)
        {
            if(j==-1) p=i,j=0;
            while(p<s_len && s[i]==t[j])
            {
                p++;
                j++;
            }
            extend[i]=j;
            a=i;
        }
        else extend[i]=extend[i-a];
    }
}

 

posted @ 2017-07-10 10:59  十年换你一句好久不见  阅读(135)  评论(0编辑  收藏  举报