扩展KMP模版

函数:

//计算s1的任意后缀与s2的最长公共前缀,结果存入ex中
void exkmp(char s1[],char s2[],int next1[],int ex[])
{
    int i,j,p;
    for(i=0,j=0,p=-1;s1[i]!='\0';i++,j++,p--)
    {
        if(p==-1)
        {
            j=0;
            do
                p++;
            while(s1[i+p]!='\0'&&s1[i+p]==s2[j+p]);
            ex[i]=p;
        }
        else if(next1[j]<p)
        {
            ex[i]=next1[j];
        }
        else if(next1[j]>p)
        {
            ex[i]=p;
        }
        else
        {
            j=0;
            while(s1[i+p]!='\0'&&s1[i+p]==s2[j+p])
                p++;
            ex[i]=p;
        }
    }
    ex[i]=0;
}

使用方法:

next1[0]=0;
exkmp(s2+1,s2,next1,next1+1);
exkmp(s1,s2,next1,ex);

 

posted @ 2016-08-03 18:55  相儒以沫  阅读(404)  评论(0编辑  收藏  举报