欢迎来到入门教程网!

C语言

当前位置:主页 > 软件编程 > C语言 >

扩展KMP算法(Extend KMP)

来源:本站原创|时间:2020-01-10|栏目:C语言|点击:240 次

扩展kmp既是求模式串和主串的每一个后缀的最长公共前缀

即令s表示主串中以第i个位置为起始的后缀,则B表示s和模式串的最长公共前缀

显然KMP是求s=模式串长度的情况,所以,扩展KMP是对KMP的拓展

像求KMP的next数组一样,我们先求A,表示模式串的后缀和模式串的最长公共前缀

然后再利用A求出B
说明一下A的求法,B同理
现在我们要求A,且A1---Ai-1已经求出,设k,且1<=k<=i-1,并满足k+A最大
所以T--Tk+A-1=T0--TA-1,推出T--Tk+A-1=Ti-k--TA-1
令L=Ai-k,若L+i-1<k+A-1,由A是最长公共前缀知A=L,否则,向后匹配,知道字符串失配
并相应更新k
时间复杂度为线性O(m+n)

while(1+j<strlen(T)&&T0+j==T1+j)
        j = j + 1;
 A1=j;
    int k=1;
    for(int i=2; i<strlen(T); i++)
   
        int Len = k + A - 1,L = Ai-k;
        if( L < Len - i + 1 )
            A = L;
        else
       
            j = max(0,Len -i +1);
            while(i+j<strlen(T)&&Ti+j == T0+j)
                j = j + 1;
            A = j,k = i;
       
   
    j = 0;
    while(j<strlen(S)&&j<strlen(T)&&T0+j==S0+j)
        j = j + 1;
    B0 = j,k = 0;
    for(int i=1; i<strlen(S); i++)
   
        int Len = k + B - 1,L = Ai-k;
        if( L < Len - i + 1 )
            B = L;
        else
       
            j = max(0,Len -i +1);
            while(i+j<strlen(S)&&j<strlen(T)&&Si+j == T0+j)
                j = j + 1;
            B = j,k = i;
       
   
 ps:普通的next是到这个结尾的,能和模式串匹配的长度,扩展kmp是以这个开头的能匹配的最大长度
pss:然后我简单比较了下kmp和扩展kmp http://www.isnowfy.com/kmp-and-extend-kmp/

上一篇:C++输入输出注意事项总结

栏    目:C语言

下一篇:C++类基本语法实例分析

本文标题:扩展KMP算法(Extend KMP)

本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/3460.html

网页制作CMS教程网络编程软件编程脚本语言数据库服务器

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:835971066 | 邮箱:835971066#qq.com(#换成@)

Copyright © 2002-2020 脚本教程网 版权所有