栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

扩展KMP算法(Extend KMP)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

扩展KMP算法(Extend KMP)

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

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

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

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

然后再利用A[i]求出B[i]
说明一下A的求法,B同理
现在我们要求A[i],且A[1]---A[i-1]已经求出,设k,且1<=k<=i-1,并满足k+A[k]最大
所以T[k]--T[k+A[k]-1]=T[0]--T[A[k]-1],推出T[i]--T[k+A[k]-1]=T[i-k]--T[A[k]-1]
令L=A[i-k],若L+i-1 并相应更新k
时间复杂度为线性O(m+n)

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/65542.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号