KMP python实现
首先去 https://blog.csdn.net/starstar1992/article/details/54913261/ 这里看下思想;
然后代码实现,一定要多调试几遍方能看懂:
- def gen_pnext(p):
- i, k, m = 0, -1, len(p)
- pnext = [-1] * m #初始化数组元素全为-1,-1表示当前元素之前的字符串相同的最大前缀和最大后缀元素个数
- while i < m-1: #不能超过模式数组的长度
- print('i=',i)
- print('p[i]=',p[i])
- print('k=',k)
- print('p[k]=',p[k])
- print('pnext=',pnext)
- if k == -1 or p[i] == p[k]: #k=-1表示还没对相应位置的元素求移动量,
- # p[i]==p[k]表示当前元素与k位置元素相等(第一次时k肯定为0),
- # 然后i,k同时后移继续比较元素个数。
- # k=0表示前后最大相同字串个数为0,k=1表示有1个相同的,k=2表示有2个
- i, k = i+1, k+1
- pnext[i] = k
- else:
- k = pnext[k]
- return pnext
- t = 'abbcabca'
- p = 'abbcabc'
- print(gen_pnext(p))
完整代码:
- def matching_KMP(t, p, pnext):
- j, i = 0, 0
- n, m = len(t), len(p)
- while j < n and i < m:
- if i == -1 or t[j] == p[i]:
- j, i = j+1, i+1
- else:
- i = pnext[i]
- if i == m:
- return j - 1
- return -1
- def gen_pnext(p):
- i, k, m = 0, -1, len(p)
- pnext = [-1] * m #初始化数组元素全为-1,-1表示当前元素之前的字符串相同的最大前缀和最大后缀元素个数
- while i < m-1: #不能超过模式数组的长度
- print('i=',i)
- print('p[i]=',p[i])
- print('k=',k)
- print('p[k]=',p[k])
- print('pnext=',pnext)
- if k == -1 or p[i] == p[k]: #k=-1表示还没对相应位置的元素求移动量,
- # p[i]==p[k]表示当前元素与k位置元素相等(第一次时k肯定为0),
- # 然后i,k同时后移继续比较元素个数。
- # k=0表示前后最大相同字串个数为0,k=1表示有1个相同的,k=2表示有2个
- i, k = i+1, k+1
- pnext[i] = k
- else:
- k = pnext[k]
- return pnext
- t = 'abbcabca'
- p = 'abbcabc'
- print(gen_pnext(p))
- print(matching_KMP(t,p,gen_pnext(p)))
如有疑问,欢迎留言!
KMP python实现的更多相关文章
- 字符串匹配的KMP算法——Python实现
#! /usr/bin/python # coding=utf-8 """ 基于这篇文章的python实现 http://blog.sae.sina.com.cn/arc ...
- 流动python - 字符串KMP匹配
首先我们看一下简单的字符串匹配. 你可以把文本字符串s固定,模式字符串p从s对齐的左边缘,作为承担部分完全一致,匹配成功,失败将是模式字符串p整体向右1地点,继续检查对齐部分,重复. #朴素匹配 de ...
- kmp算法python实现
kmp算法python实现 kmp算法 kmp算法用于字符串的模式匹配,也就是找到模式字符串在目标字符串的第一次出现的位置比如abababc那么bab在其位置1处,bc在其位置5处我们首先想到的最简单 ...
- 字符串匹配的kmp算法 及 python实现
一:背景 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即串的模式匹配问题. Knuth-Morris-Pratt 算法(简称 KMP)是解决这一问题的常 ...
- 字符串匹配算法之 kmp算法 (python版)
字符串匹配算法之 kmp算法 (python版) 1.什么是KMP算法 KMP是三位大牛:D.E.Knuth.J.H.MorriT和V.R.Pratt同时发现的.其中第一位就是<计算机程序设计艺 ...
- KMP算法-Python版
KMP算法-Python版 传统法: 从左到右一个个匹配,如果这个过程中有某个字符不匹配,就跳回去,将模式串向右移动一位.这有什么难的? 我们可以 ...
- Python 细聊从暴力(BF)字符串匹配算法到 KMP 算法之间的精妙变化
1. 字符串匹配算法 所谓字符串匹配算法,简单地说就是在一个目标字符串中查找是否存在另一个模式字符串.如在字符串 "ABCDEFG" 中查找是否存在 "EF" ...
- [ Python ] KMP Algorithms
def pmt(s): """ :param s: the string to get its partial match table :return: partial ...
- BF算法和KMP算法 python实现
BF算法 def Index(s1,s2,pos = 0): """ BF算法 """ i = pos j = 0 while(i < ...
随机推荐
- LightOJ-1028 Trailing Zeroes (I)---因子数目
题目链接: https://cn.vjudge.net/problem/LightOJ-1028 题目大意: 一个十进制数1≤n≤1012,现在用base进制来表示,问有多少种表示方法使得最后一位上的 ...
- What is a Thread?
https://computing.llnl.gov/tutorials/pthreads/ Technically, a thread is defined as an independent st ...
- 【洛谷P2577】[ZJOI2005]午餐
午餐 题目链接 DP题都辣么毒瘤的么.. 首先,看一下题解 我们就有了思路: 贪心:显然,让吃饭慢的先打饭,sort一遍(证明?不存在的.. DP:f[i][j][k]表示前i个人,窗口1的打饭时间为 ...
- 【Linux-CentOS】CentOS安装Win双系统后Win启动项丢失及默认启动项修改
转载自:搁浅bky,有部分更正,建议看此文. 1.Windows启动项消失的原因: 在安装Win7.8/10系统+CentOS7双系统后,默认会将mbr(Main Boot Record)改写为g ...
- Vue nodejs商城项目-商品的分页、排序、筛选
.分页 ,要查第3页的数据,则跳过2*8条数据,然后返回8条数据. 在实现滚动加载时,页面刚一加载完成并不需要请求所有数据,当用户下拉到页面底部时,再去请求数据并拼接到商品数据列表中. 通过vue-i ...
- 推荐几款基于vue的使用插件
1.muse-ui ★6042 - 三端样式一致的响应式 UI 库 2.vuetify ★11169 - 为移动而生的Vue JS 2组件框架 3.Vux ★12969- 基于Vue和WeUI的组件库 ...
- 菜鸟笔记 -- Chapter 09 常见类和接口
Java为我们提供了丰富的jar包支持,这其中很多都是我们日常开发所必须的,了解这些包和类,十分有助于我们的开发,深度了解源代码也有助于我们代码的优化和提高;JDK1.8为我们提供了多于4000个类与 ...
- multimap的使用
multimap由于允许有重复的元素,所以元素插入.删除.查找都与map不同. 插入insert(pair<a,b>(value1,value2)) #include <iostre ...
- Chino的成绩(chino的公开赛T3)
题目背景 曾经幻想过未来的风景 或许有着另外一片天 小镇的远方 有着深远的回忆 也有着富有深情的诗篇 题目描述 Chino非常注重自己的成绩 Chino有 m 种方式给自己增加 rp 以增加成绩,她的 ...
- PG进程结构和内存结构
本文主要介绍PostgreSQL数据库(后文简称PG)进程结构和内存结构,物理结构将在后续继续整理分享. 上图描述了PG进程结构.内存结构和部分物理结构的内容.图中的内容包含了两个部分: PG ...