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实现测试磁盘性能的方法
Mar 12 Python
Python实现完整的事务操作示例
Jun 20 Python
基于Django的ModelForm组件(详解)
Dec 07 Python
Python排序搜索基本算法之插入排序实例分析
Dec 11 Python
Python利用openpyxl库遍历Sheet的实例
May 03 Python
python3第三方爬虫库BeautifulSoup4安装教程
Jun 19 Python
对python 数据处理中的LabelEncoder 和 OneHotEncoder详解
Jul 11 Python
对python中Json与object转化的方法详解
Dec 31 Python
Python查找数组中数值和下标相等的元素示例【二分查找】
Feb 13 Python
windows上彻底删除jupyter notebook的实现
Apr 13 Python
Django权限控制的使用
Jan 07 Python
分位数回归模型quantile regeression应用详解及示例教程
Nov 02 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中的字符串函数
2006/10/09 PHP
PHP数组及条件,循环语句学习
2012/11/11 PHP
简单说说PHP优化那些事(经验分享)
2014/11/27 PHP
ThinkPHP控制器详解
2015/07/27 PHP
详解php比较操作符的安全问题
2015/12/03 PHP
JavaScript学习历程和心得小结
2010/08/16 Javascript
jquery获取radio值实例
2014/10/16 Javascript
node.js中的fs.readFileSync方法使用说明
2014/12/15 Javascript
javascript中使用new与不使用实例化对象的区别
2015/06/22 Javascript
JavaScript学习总结之JS、AJAX应用
2016/01/29 Javascript
jQuery UI库中dialog对话框功能使用全解析
2016/04/23 Javascript
Javascript打印局部页面实例
2016/06/21 Javascript
Bootstrap整体框架之JavaScript插件架构
2016/12/15 Javascript
微信小程序三级联动选择器使用方法
2020/05/19 Javascript
webpack4.x CommonJS模块化浅析
2018/11/09 Javascript
vue多次循环操作示例
2019/02/08 Javascript
微信小程序云开发如何使用云函数生成二维码
2019/05/18 Javascript
详解Vue的watch中的immediate与watch是什么意思
2019/12/30 Javascript
Vue.js实现立体计算器
2020/02/22 Javascript
vue自定义指令和动态路由实现权限控制
2020/08/28 Javascript
javascript canvas实现简易时钟例子
2020/09/05 Javascript
vue+echarts+datav大屏数据展示及实现中国地图省市县下钻功能
2020/11/16 Javascript
vue 数据遍历筛选 过滤 排序的应用操作
2020/11/17 Javascript
Python实现拷贝多个文件到同一目录的方法
2016/09/19 Python
Python request设置HTTPS代理代码解析
2018/02/12 Python
使用python编写udp协议的ping程序方法
2018/04/22 Python
pygame实现雷电游戏雏形开发
2018/11/20 Python
Python实现E-Mail收集插件实例教程
2019/02/06 Python
HTML5的革新 结构之美
2011/06/20 HTML / CSS
Application Cache未缓存文件无法访问无法加载问题
2014/05/31 HTML / CSS
Hanro官网:奢华男士和女士内衣、睡衣和家居服
2018/10/25 全球购物
毕业生找工作的自我评价
2013/10/18 职场文书
在求职信中如何凸显个人优势
2013/10/30 职场文书
养成教育经验材料
2014/05/26 职场文书
婚宴来宾致辞
2015/07/28 职场文书
Python连续赋值需要注意的一些问题
2021/06/03 Python