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 相关文章推荐
用ReactJS和Python的Flask框架编写留言板的代码示例
Dec 19 Python
Python中运算符&quot;==&quot;和&quot;is&quot;的详解
Oct 08 Python
Python实现扣除个人税后的工资计算器示例
Mar 26 Python
python实现逆序输出一个数字的示例讲解
Jun 25 Python
windows下 兼容Python2和Python3的解决方法
Dec 05 Python
对Python 多线程统计所有csv文件的行数方法详解
Feb 12 Python
如何使用Python自动控制windows桌面
Jul 11 Python
关于pytorch中网络loss传播和参数更新的理解
Aug 20 Python
浅谈Python 递归算法指归
Aug 22 Python
详解Python3 pickle模块用法
Sep 16 Python
python爬虫模块URL管理器模块用法解析
Feb 03 Python
Python类中self参数用法详解
Feb 13 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 文件上传源码分析(RFC1867)
2009/10/30 PHP
PHP中echo和print的区别
2014/08/28 PHP
Zend Framework教程之Zend_Form组件实现表单提交并显示错误提示的方法
2016/03/21 PHP
PHP magento后台无法登录问题解决方法
2016/11/24 PHP
PHP扩展Swoole实现实时异步任务队列示例
2019/04/13 PHP
在Z-Blog中运行代码[html][/html](纯JS版)
2007/03/25 Javascript
对之前写的jquery分页做下升级
2014/06/19 Javascript
javascript中解析四则运算表达式的算法和示例
2014/08/11 Javascript
浅谈利用JavaScript进行的DDoS攻击原理与防御
2015/06/04 Javascript
jQuery中trigger()与bind()用法分析
2015/12/18 Javascript
Javascript的this用法
2017/01/16 Javascript
bootstrap中模态框、模态框的属性实例详解
2017/02/17 Javascript
jQuery实现web页面樱花坠落的特效
2017/06/01 jQuery
详解Vue + Vuex 如何使用 vm.$nextTick
2017/11/20 Javascript
webpack打包并将文件加载到指定的位置方法
2018/02/22 Javascript
vue项目中公用footer组件底部位置的适配问题
2018/05/10 Javascript
《javascript少儿编程》location术语总结
2018/05/27 Javascript
微信小程序停止其他视频播放当前视频的实例代码
2019/12/25 Javascript
微信小程序返回上一级页面的实现代码
2020/06/19 Javascript
Openlayers3实现车辆轨迹回放功能
2020/09/29 Javascript
python的Tqdm模块的使用
2018/01/10 Python
使用Python制作新型冠状病毒实时疫情图
2020/01/28 Python
基于python实现破解滑动验证码过程解析
2020/05/28 Python
详解python的变量缓存机制
2021/01/24 Python
上海中网科技笔试题
2012/02/19 面试题
自荐信范文
2013/12/10 职场文书
大学生学习2014年全国两会心得体会
2014/03/12 职场文书
产品销售计划书
2014/05/04 职场文书
横幅标语大全
2014/06/17 职场文书
我们的节日中秋活动方案
2014/08/19 职场文书
设备收款委托书范本
2014/10/02 职场文书
2014年高三班主任工作总结
2014/12/05 职场文书
汽车车尾标语大全
2015/08/11 职场文书
《钢铁是怎样炼成的》高中读后感
2019/08/07 职场文书
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
2021/05/12 Python
Win11怎么跳过联网验机 ?Win11跳过联网验机激活教程
2022/04/05 数码科技