首先去 https://blog.csdn.net/starstar1992/article/details/54913261/ 这里看下思想;

然后代码实现,一定要多调试几遍方能看懂:

  1. def gen_pnext(p):
  2. i, k, m = 0, -1, len(p)
  3. pnext = [-1] * m #初始化数组元素全为-1,-1表示当前元素之前的字符串相同的最大前缀和最大后缀元素个数
  4. while i < m-1: #不能超过模式数组的长度
  5. print('i=',i)
  6. print('p[i]=',p[i])
  7. print('k=',k)
  8. print('p[k]=',p[k])
  9. print('pnext=',pnext)
  10. if k == -1 or p[i] == p[k]: #k=-1表示还没对相应位置的元素求移动量,
  11. # p[i]==p[k]表示当前元素与k位置元素相等(第一次时k肯定为0),
  12. # 然后i,k同时后移继续比较元素个数。
  13. # k=0表示前后最大相同字串个数为0,k=1表示有1个相同的,k=2表示有2个
  14. i, k = i+1, k+1
  15. pnext[i] = k
  16. else:
  17. k = pnext[k]
  18. return pnext
  19. t = 'abbcabca'
  20. p = 'abbcabc'
  21. print(gen_pnext(p))

完整代码:

  1. def matching_KMP(t, p, pnext):
  2. j, i = 0, 0
  3. n, m = len(t), len(p)
  4. while j < n and i < m:
  5. if i == -1 or t[j] == p[i]:
  6. j, i = j+1, i+1
  7. else:
  8. i = pnext[i]
  9. if i == m:
  10. return j - 1
  11. return -1
  12.  
  13. def gen_pnext(p):
  14. i, k, m = 0, -1, len(p)
  15. pnext = [-1] * m #初始化数组元素全为-1,-1表示当前元素之前的字符串相同的最大前缀和最大后缀元素个数
  16. while i < m-1: #不能超过模式数组的长度
  17. print('i=',i)
  18. print('p[i]=',p[i])
  19. print('k=',k)
  20. print('p[k]=',p[k])
  21. print('pnext=',pnext)
  22. if k == -1 or p[i] == p[k]: #k=-1表示还没对相应位置的元素求移动量,
  23. # p[i]==p[k]表示当前元素与k位置元素相等(第一次时k肯定为0),
  24. # 然后i,k同时后移继续比较元素个数。
  25. # k=0表示前后最大相同字串个数为0,k=1表示有1个相同的,k=2表示有2个
  26. i, k = i+1, k+1
  27. pnext[i] = k
  28. else:
  29. k = pnext[k]
  30. return pnext
  31. t = 'abbcabca'
  32. p = 'abbcabc'
  33. print(gen_pnext(p))
  34. print(matching_KMP(t,p,gen_pnext(p)))

如有疑问,欢迎留言!

KMP python实现的更多相关文章

  1. 字符串匹配的KMP算法——Python实现

    #! /usr/bin/python # coding=utf-8 """ 基于这篇文章的python实现 http://blog.sae.sina.com.cn/arc ...

  2. 流动python - 字符串KMP匹配

    首先我们看一下简单的字符串匹配. 你可以把文本字符串s固定,模式字符串p从s对齐的左边缘,作为承担部分完全一致,匹配成功,失败将是模式字符串p整体向右1地点,继续检查对齐部分,重复. #朴素匹配 de ...

  3. kmp算法python实现

    kmp算法python实现 kmp算法 kmp算法用于字符串的模式匹配,也就是找到模式字符串在目标字符串的第一次出现的位置比如abababc那么bab在其位置1处,bc在其位置5处我们首先想到的最简单 ...

  4. 字符串匹配的kmp算法 及 python实现

    一:背景 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即串的模式匹配问题. Knuth-Morris-Pratt 算法(简称 KMP)是解决这一问题的常 ...

  5. 字符串匹配算法之 kmp算法 (python版)

    字符串匹配算法之 kmp算法 (python版) 1.什么是KMP算法 KMP是三位大牛:D.E.Knuth.J.H.MorriT和V.R.Pratt同时发现的.其中第一位就是<计算机程序设计艺 ...

  6. KMP算法-Python版

                               KMP算法-Python版 传统法: 从左到右一个个匹配,如果这个过程中有某个字符不匹配,就跳回去,将模式串向右移动一位.这有什么难的? 我们可以 ...

  7. Python 细聊从暴力(BF)字符串匹配算法到 KMP 算法之间的精妙变化

    1. 字符串匹配算法 所谓字符串匹配算法,简单地说就是在一个目标字符串中查找是否存在另一个模式字符串.如在字符串 "ABCDEFG" 中查找是否存在 "EF" ...

  8. [ Python ] KMP Algorithms

    def pmt(s): """ :param s: the string to get its partial match table :return: partial ...

  9. BF算法和KMP算法 python实现

    BF算法 def Index(s1,s2,pos = 0): """ BF算法 """ i = pos j = 0 while(i < ...

随机推荐

  1. LightOJ-1028 Trailing Zeroes (I)---因子数目

    题目链接: https://cn.vjudge.net/problem/LightOJ-1028 题目大意: 一个十进制数1≤n≤1012,现在用base进制来表示,问有多少种表示方法使得最后一位上的 ...

  2. What is a Thread?

    https://computing.llnl.gov/tutorials/pthreads/ Technically, a thread is defined as an independent st ...

  3. 【洛谷P2577】[ZJOI2005]午餐

    午餐 题目链接 DP题都辣么毒瘤的么.. 首先,看一下题解 我们就有了思路: 贪心:显然,让吃饭慢的先打饭,sort一遍(证明?不存在的.. DP:f[i][j][k]表示前i个人,窗口1的打饭时间为 ...

  4. 【Linux-CentOS】CentOS安装Win双系统后Win启动项丢失及默认启动项修改

    转载自:搁浅bky,有部分更正,建议看此文. 1.Windows启动项消失的原因:   在安装Win7.8/10系统+CentOS7双系统后,默认会将mbr(Main Boot Record)改写为g ...

  5. Vue nodejs商城项目-商品的分页、排序、筛选

    .分页 ,要查第3页的数据,则跳过2*8条数据,然后返回8条数据. 在实现滚动加载时,页面刚一加载完成并不需要请求所有数据,当用户下拉到页面底部时,再去请求数据并拼接到商品数据列表中. 通过vue-i ...

  6. 推荐几款基于vue的使用插件

    1.muse-ui ★6042 - 三端样式一致的响应式 UI 库 2.vuetify ★11169 - 为移动而生的Vue JS 2组件框架 3.Vux ★12969- 基于Vue和WeUI的组件库 ...

  7. 菜鸟笔记 -- Chapter 09 常见类和接口

    Java为我们提供了丰富的jar包支持,这其中很多都是我们日常开发所必须的,了解这些包和类,十分有助于我们的开发,深度了解源代码也有助于我们代码的优化和提高;JDK1.8为我们提供了多于4000个类与 ...

  8. multimap的使用

    multimap由于允许有重复的元素,所以元素插入.删除.查找都与map不同. 插入insert(pair<a,b>(value1,value2)) #include <iostre ...

  9. Chino的成绩(chino的公开赛T3)

    题目背景 曾经幻想过未来的风景 或许有着另外一片天 小镇的远方 有着深远的回忆 也有着富有深情的诗篇 题目描述 Chino非常注重自己的成绩 Chino有 m 种方式给自己增加 rp 以增加成绩,她的 ...

  10. PG进程结构和内存结构

    ​ 本文主要介绍PostgreSQL数据库(后文简称PG)进程结构和内存结构,物理结构将在后续继续整理分享. ​ 上图描述了PG进程结构.内存结构和部分物理结构的内容.图中的内容包含了两个部分: PG ...