python3 kmp 字符串匹配的方法


Posted in Python onJuly 07, 2018

先声明,本人菜鸟一个,写博客是为了记录学习的过程,以及自己的理解和心得,可能有的地方写的不好,希望大神指出。。。

抛出问题

给定一个文本串test_str(被匹配的字符串)和模式串pat_str(需要从文本串中匹配的字符串),从文本串test_str中找出模式串pat_str第一次出现的位置,没有的话返回 -1

暴力方式

在说kmp之前,我们先来讲下“暴力方式“,也就是说我们最原始的方法。 

text_str = 'asdabcdace'
pat_str = 'abcdace'

def str_match(text_str,pat_str):
  for i in range(0,len(text_str)):
    j = 1
    while j < len(pat_str):
      if text_str[i:i+j] != pat_str[0:j]: #从text_str第i个字符开始,看匹配是否成功
        break  #匹配失败,直接跳出循环,i+1,继续从第一个字符匹配
      j += 1   #匹配成功就继续匹配下一个字符,知道pat_str每个字符都匹配完
    if j == len(pat_str):
      return i
  return -1

print(str_match(text_str,pat_str))

之所以称之为暴力解法,就是因为每次匹配失败之后就将模式串,向后移动一位,从头开始匹配,一直循环下去。造成时间复杂度高,kmp也就是优化这个地方,每一次匹配失败,下次移动的距离next值

python3 kmp 字符串匹配的方法

KMP

如果让我完全给你讲懂kmp算法可能不太容易,我只能大致粗略的将下它的一步步实现。我认为就一个重点,

如何求出模式串每个字符对应的next值

因为可能,每一次匹配失败的长度的字符不一样,也就对应每次移动的距离不一样,那我们如何求每个字符对应的next值,这就引出了另一个概念

最大前缀和最大后缀

python3 kmp 字符串匹配的方法

假定最大前缀=最大后缀,长度为k 那么第i位字符,对应的next值就为k+1,一次循环就能求出每个字符的next值

代码实现

#求字符串的next值
text_str = 'asdabcdace'
pat_str = 'abcdace'

#得到字符对应的next值
def str_next(s):
  #前两个字符默认等于1
  next = [1,1]
  for x in range(2,len(s)):
    next.append(str_max_prx(s,x,next[x-1]-1) + 1)
  return next
#参数 s字符串,匹配进行到的位置,下次开始匹配的位置
def str_max_prx(s,x,last_value):
  next = 0
  for i in range(last_value,x):
    if s[0:i] == s[x-i:x]:
      next = i
  return next
def str_match(s,m):
  next = str_next(s)
  i=0
  s_len = len(s)
  m_len = len(m)
  while i <= m_len:
    flag = True   #标志位,用来判断是否匹配成功
    index = 1
    while index <= s_len:
      if m[i:i + index] != s[0:index]:
        i = i + next[index]
        flag = False
        break
      else:
        index += 1
    if flag:
      break
  if i >= m_len:
    i = -1
  return i
res = str_match(pat_str,text_str)
print(res)

代码就是这样,很多东西可能还需要自己理解。我记个笔记,为之后方便查找,希望对你能有帮助。也希望大家多多支持三水点靠木。

Python 相关文章推荐
python单链表实现代码实例
Nov 21 Python
Python的垃圾回收机制深入分析
Jul 16 Python
python脚本实现查找webshell的方法
Jul 31 Python
Python3中常用的处理时间和实现定时任务的方法的介绍
Apr 07 Python
举例讲解Python程序与系统shell交互的方式
Apr 09 Python
python机器学习之决策树分类详解
Dec 20 Python
python脚本当作Linux中的服务启动实现方法
Jun 28 Python
django多文件上传,form提交,多对多外键保存的实例
Aug 06 Python
简单了解Python write writelines区别
Feb 27 Python
python 6.7 编写printTable()函数表格打印(完整代码)
Mar 25 Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
Feb 03 Python
完美解决torch.cuda.is_available()一直返回False的玄学方法
Feb 06 Python
vue.js实现输入框输入值内容实时响应变化示例
Jul 07 #Python
详解Python最长公共子串和最长公共子序列的实现
Jul 07 #Python
python求最大连续子数组的和
Jul 07 #Python
python 平衡二叉树实现代码示例
Jul 07 #Python
详解python异步编程之asyncio(百万并发)
Jul 07 #Python
基于Python开发chrome插件的方法分析
Jul 07 #Python
Python实现基于C/S架构的聊天室功能详解
Jul 07 #Python
You might like
奇怪的PHP引用效率问题分析
2012/03/23 PHP
PHP中PDO连接数据库中各种DNS设置方法小结
2016/05/13 PHP
基于PHP后台的Android新闻浏览客户端
2016/05/23 PHP
YUI 读码日记之 YAHOO.util.Dom - Part.1
2008/03/22 Javascript
JS之小练习代码
2008/10/12 Javascript
Javascript常考语句107条收集
2010/03/09 Javascript
javascript 正则表达式相关应介绍
2012/11/27 Javascript
JavaScript实现x秒后自动跳转到一个页面
2013/01/03 Javascript
JavaScript实现向setTimeout执行代码传递参数的方法
2015/04/16 Javascript
jQuery实现带滑动条的菜单效果代码
2015/08/26 Javascript
JavaScritp添加url参数并将参数加入到url中及更改url参数的方法
2015/10/26 Javascript
jquery实现简易的移动端验证表单
2015/11/08 Javascript
jQuery点击其他地方时菜单消失的实现方法
2016/04/22 Javascript
jQuery事件绑定用法详解
2016/09/08 Javascript
javascript函数的四种调用模式
2017/01/08 Javascript
图片加载完成再执行事件的实例
2017/11/16 Javascript
原生JS使用Canvas实现拖拽式绘图功能
2019/06/05 Javascript
一篇文章带你搞懂Vue虚拟Dom与diff算法
2020/08/25 Javascript
[48:32]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python绑定方法与非绑定方法详解
2017/08/18 Python
python 提取tuple类型值中json格式的key值方法
2018/12/31 Python
python3 json数据格式的转换(dumps/loads的使用、dict to str/str to dict、json字符串/字典的相互转换)
2019/04/01 Python
使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)
2019/05/28 Python
解决python flask中config配置管理的问题
2019/07/26 Python
Python urlopen()和urlretrieve()用法解析
2020/01/07 Python
Python中的 ansible 动态Inventory 脚本
2020/01/19 Python
基于Python获取docx/doc文件内容代码解析
2020/02/17 Python
伦敦所有西区剧院演出官方票务代理:Theatre Tickets Direct
2017/05/26 全球购物
美国流行背包品牌:JanSport(杰斯伯)
2018/03/02 全球购物
简述数组与指针的区别
2014/01/02 面试题
超市工作总结范文2014
2014/12/19 职场文书
大连导游词
2015/02/12 职场文书
闪闪红星观后感
2015/06/08 职场文书
法律讲堂观后感
2015/06/11 职场文书
Python中快速掌握Data Frame的常用操作
2021/03/31 Python
Pandas数据类型之category的用法
2021/06/28 Python