数据结构(串之KMP算法)

本文深入解析KMP算法,探讨其如何避免子串与模式串部分匹配时的重复比较,通过实例展示next数组与nextval数组的计算过程,以及KMP算法的实现方式,帮助读者理解并掌握KMP算法的核心思想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

若不经常出现子串与模式串部分匹配的问题,KMP算法和朴素算法差不多

KMP算法:主串不回溯,只有模式串的指针回溯

求next数组

当模式串的第 j 个字符匹配失败时,令模式串跳到 next[j],再继续匹配

串的前缀:包含第一个字符且不包括最后一个字符的子串

串的后缀:包含最后一个字符且不包括第一个字符的子串

当第j个字符串匹配失败,由前1~j-1个字符组成的串记为S,则:

next[j] = S的最长相等前后缀长度+1

注:next[1] = 0

模式串:ababaa
序号J123456
模式串ababaa
next[j]011234
模式串:aaaab
序号J12345
模式串aaaab
next[j]01234
KMP算法实现
//S为原串,T为模式串,next是构造的数组
int Index_KMP(SString S,SString T,int next[])
{
    int i=1,j=1;
    while(i<=S.length && j<=T.length)
    {
        if(j==0 || S.ch[i]==T.ch[i])
        {
            ++i;
            ++j;
        }
        else
            j = next[j];
    }
    if(j>T.length)
        return i-T.length;
    else
        return 0;
}

//next[]不作为参数传进来
//平均时间复杂度O(m+n)
int Index_KMP(SString S,SString T)
{
    int i=1,j=1;
    int next[T.length+1];
    get_next(T,next);//时间复杂度O(m),m为模式串长度
    while(i<=S.length && j<=T.length)
    {
        if(j==0 || S.ch[i]==T.ch[j])
        {
            ++i;
            ++j;
        }
        else
            j=next[j];
    }
    if(j>T.length)
        return i-T.length;
    else
        return 0;
}
优化next数组——>nextval

解决无意义对比

模式串:google
序号123456
模式串google
next[j]011121
nextval[j]011021
模式串:aaaab
序号12345
模式串aaaab
next[j]01234
nextval[j]00004
模式串:ababaa
序号123456
模式串ababaa
next[j]011234
nextval[j]010104

我的博客 www.aiguitar.top

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值