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爬虫框架Scrapy实例代码
Mar 04 Python
Python实现确认字符串是否包含指定字符串的实例
May 02 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
Oct 11 Python
Python GUI布局尺寸适配方法
Oct 11 Python
如何使用python爬虫爬取要登陆的网站
Jul 12 Python
python3多线程知识点总结
Sep 26 Python
Django之使用celery和NGINX生成静态页面实现性能优化
Oct 08 Python
python 生成器和迭代器的原理解析
Oct 12 Python
Keras中的两种模型:Sequential和Model用法
Jun 27 Python
为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景
Jan 05 Python
python如何做代码性能分析
Apr 26 Python
使用Djongo模块在Django中使用MongoDB数据库
Jun 20 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
Zend Framework中的简单工厂模式 图文
2012/07/10 PHP
PHP获取时间排除周六、周日的两个方法
2014/06/30 PHP
php通过array_merge()函数合并两个数组的方法
2015/03/18 PHP
redirect_uri参数错误的解决方法(必看)
2017/02/16 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
2017/03/19 PHP
php中curl和soap方式请求服务超时问题的解决
2018/06/11 PHP
PHP+Ajax简单get验证操作示例
2019/03/02 PHP
js实现的网站首页随机公告随机公告
2007/03/14 Javascript
div模拟滚动条效果示例代码
2013/10/16 Javascript
JQuery判断radio是否选中并获取选中值的示例代码
2014/10/17 Javascript
javascript实现时间格式输出FormatDate函数
2015/01/13 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
2015/09/01 Javascript
Jquery Easyui自定义下拉框组件使用详解(21)
2020/12/31 Javascript
详谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/25 Javascript
新手vue构建单页面应用实例代码
2017/09/18 Javascript
React 组件转 Vue 组件的命令写法
2018/02/28 Javascript
vuejs点击class变化的实例
2018/09/05 Javascript
node全局变量__dirname与__filename的区别
2019/01/14 Javascript
js图片查看器插件用法示例
2019/06/22 Javascript
Vue的状态管理vuex使用方法详解
2020/02/05 Javascript
[01:08]2014DOTA2展望TI 剑指西雅图LGD战队专访
2014/06/30 DOTA
python使用socket连接远程服务器的方法
2015/04/29 Python
python中的文件打开与关闭操作命令介绍
2018/04/26 Python
Python堆排序原理与实现方法详解
2018/05/11 Python
Windows平台Python编程必会模块之pywin32介绍
2019/10/01 Python
详解Css3新特性应用之过渡与动画
2017/01/10 HTML / CSS
基于HTML5 audio元素播放声音jQuery小插件
2011/05/11 HTML / CSS
html5 Canvas画图教程(8)—canvas里画曲线之bezierCurveTo方法
2013/01/09 HTML / CSS
HTML5制作表格样式
2016/11/15 HTML / CSS
意大利值得信赖的在线超级药房:PillolaStore
2020/02/05 全球购物
L’Artisan Parfumeur官网:法国香水品牌
2020/08/11 全球购物
酒店中秋节活动方案
2014/01/31 职场文书
士力架广告词
2014/03/20 职场文书
2014年爱国卫生工作总结
2014/11/22 职场文书
个人求职意向书
2015/05/11 职场文书
gtx1650怎么样 gtx1650显卡相当于什么级别
2022/04/08 数码科技