千家信息网

Python如何实现KPM算法

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章主要介绍Python如何实现KPM算法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!知识点说明:先说前缀,和后缀吧比如有一个串:abab则在下标为3处的(前缀和后缀都要
千家信息网最后更新 2026年11月04日Python如何实现KPM算法

这篇文章主要介绍Python如何实现KPM算法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

知识点说明:

先说前缀,和后缀吧

比如有一个串:abab

则在下标为3处的(前缀和后缀都要比下标出的长度小1,此处下标为3出的长度是4)

前缀为:a,ab,aba

后缀为:b,ba,bab

一、要获取KPM算法的next[]数组

简单说一下原理吧,首先k,用来存放前缀的下标,首先初始化j=0(j用来表示模式串的下标,一直去模式串的每一位与前面的进行比较,如果相等,则记录下当前位置与前面的哪个位置相同,我们这里主要是要记录相同位置的下一个位置,就是不相同的位置,从不相同的位置开始比较,就是回溯到不相同位置,所以这里在t[j]==t[k]成立的时候要j+1,为了比较下一个位置是否相同,k也要+1),模式串从0开始,k=-1,next[0]=-1第一个位置赋默认值-1;

此处串采用="abab"

第一次循环:

判断k是否等于-1,如果等于则,j和k都+1,

此时j=1,k=0,next[1]=0,也就是第2个位置(下标1)的回溯位置还是0,因为前缀的最大长度必须小于当前位置的长度;

第二次循环:

j=1,k=0,next[1]=0;k已经不等于-1了,判断t[j]==t[k],t[1]==t[0],t[1]="b",t[0]="a",不相等

执行else:

k=next[0]=-1

第三次循环:

k==-1

j和k都+1,j=2,k=0,next[2]=0

第四次循环:

k不等于-1,判断t[2]==t[0],t[2]="a"=t[0]="a",成立

j和k都+1,j=3,k=1,next[3]=1

此时next=[-1,0,0,1],next[3]=1表示在next[3]处发生不匹配时,也就是模式串下标为3时为"b",说明前面aba都是和目标串都匹配,所以模式串不匹配位置前面的串aba一定与目标串不匹配位置前面的前3个值相等,也就是aba,所以此刻,只需要回溯到模式串的1位置,也就是模式串的b,模式串b前面是a,满足目标串的前一个a。

第五次循环:

k依旧是不等于-1,就是比较上一个位置后面的两个数再进行比较,简单的说,以此取出每一项与第一项比较,如果存在相等的就再比较下一个与第二项是否相等。

代码如下:

def GetNext(t, next):    j, k = 0, -1    next[0] = -1    while j < len(t) - 1:        if k == -1 or t[j] == t[k]:  # 如果k==-1 或者 开始位置和结尾位置有相同的元素            j, k = j + 1, k + 1  # j和k都加1,当前位匹配,则从下一个位置开始匹配,所以k+1;j再进行取下一位判断是否也是匹配,所以也要+1            next[j] = k  # 当前位置要取k项        else:#如果不相等,再把k置-1,下一次循环再进行+1操作,j这个位置再存入0,表示无匹配项            k = next[k]    return next

二、KMP函数

原理和BF算法是一样的,唯独不同的是,当模式串与目标串不匹配的时候,不直接回溯模式串,而是根据模式串的next[]表,查询要回溯到的位置,直接回溯到模式串的指定位置,KMP算法的核心也就在这里,但是这种方法一般只对前缀和后缀存在相同元素时,有效果,也就是说相同部分是一样的就不再进行比较了,从相同元素的下一个位置开始比较,所以KMP算法最复杂的部分其实就是找next[]表,要找出模式串的每一个位置,是否有相同前缀,如果有则标注该相同位置,下次回溯就不用回溯到0这个位置,可以从不相同位置开始。

def KMP(s, t):    next = [0] * len(t)    next = GetNext(t, next)    print(next)    i, j = 0, 0    while i < len(s) and j < len(t):        if j == -1 or s[i] == t[j]:            i, j = i + 1, j + 1        else:            j = next[j]    if j >= len(t):        return i - len(t)    else:        return -1

完整代码:

def GetNext(t, next):    j, k = 0, -1    next[0] = -1    while j < len(t) - 1:        if k == -1 or t[j] == t[k]:  # 如果k==-1 或者 开始位置和结尾位置有相同的元素            j, k = j + 1, k + 1  # j和k都加1,当前位匹配,则从下一个位置开始匹配,所以k+1;j再进行取下一位判断是否也是匹配,所以也要+1            next[j] = k  # 当前位置要取k项        else:#如果不相等,再把k置-1,下一次循环再进行+1操作,j这个位置再存入0,表示无匹配项            k = next[k]    return next  def KMP(s, t):    next = [0] * len(t)    next = GetNext(t, next)    print(next)    i, j = 0, 0    while i < len(s) and j < len(t):        if j == -1 or s[i] == t[j]:            i, j = i + 1, j + 1        else:            j = next[j]    if j >= len(t):        return i - len(t)    else:        return -1  if __name__ == '__main__':    re = KMP('asdfghjsssaaasdfaaaabababcdabd', "ababaaaababaa")    print(re)

结果:

以上是"Python如何实现KPM算法"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

位置 相同 模式 前缀 循环 算法 下标 也就是 元素 后缀 就是 目标 长度 从不 代码 内容 原理 时候 知识 篇文章 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技海报 百单网互联网科技有限公司怎么样 蓝思科技飞鸽互联网 深圳恒合互联网络科技有限公司 上海互联网科技有限公司 互联网科技博客 佰商互联网科技有限公司 镁科技互联网资讯平台 汉立互联网科技有限公司联系电话 哈尔滨新华互联网科技学院 受益于互联网科技的高速发展 互联网保险科技创业 华夏恒生科技与互联网科技 爱医互联网络科技 互联网科技如何创业 无锡工业互联网科技有限公司 科技互联网的核心竞争力 互联网科技资金流入 宁波跨境商互联网科技有限公司 中国主要互联网科技公司 互联网与科技发展 致聘互联网科技 互联网科技素材视频竖屏 互联网经济与金融科技 昭通互联网科技选哪家 洛阳共同富裕互联网科技有限公司 元气玛特互联网科技公司是外包吗 互联网公司高科技产品 广州百诚互联网科技有限公司官网 求路客互联网科技电话
0