python3 kmp 字符串匹配的方法

 更新时间:2018年07月07日 15:25:22   转载 作者:7749ha  
这篇文章主要介绍了python3 kmp 字符串匹配的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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

抛出问题

给定一个文本串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值

KMP

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

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

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

最大前缀和最大后缀

    

假定最大前缀=最大后缀,长度为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实现大文件排序的方法

    这篇文章主要介绍了Python大文件排序的方法,涉及Python针对文件、缓存及日期等操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • pandas 数据索引与选取的实现方法

    pandas 数据索引与选取的实现方法

    这篇文章主要介绍了pandas 数据索引与选取的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • python+selenium+chrome批量文件下载并自动创建文件夹实例

    python+selenium+chrome批量文件下载并自动创建文件夹实例

    这篇文章主要介绍了python+selenium+chrome批量文件下载并自动创建文件夹实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • 对python for 文件指定行读写操作详解

    对python for 文件指定行读写操作详解

    今天小编就为大家分享一篇对python for 文件指定行读写操作详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python编程scoketServer实现多线程同步实例代码

    Python编程scoketServer实现多线程同步实例代码

    这篇文章主要介绍了Python编程scoketServer实现多线程同步实例代码,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Python简单读写Xls格式文档的方法示例

    Python简单读写Xls格式文档的方法示例

    这篇文章主要介绍了Python简单读写Xls格式文档的方法,结合实例形式分析了Python中xlrd和xlwt模块的安装及针对xls格式文档的相关读写操作实现技巧,需要的朋友可以参考下
    2018-08-08
  • python3 实现一行输入,空格隔开的示例

    python3 实现一行输入,空格隔开的示例

    今天小编就为大家分享一篇python3 实现一行输入,空格隔开的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • 详细解读tornado协程(coroutine)原理

    详细解读tornado协程(coroutine)原理

    这篇文章主要介绍了详细解读tornado协程(coroutine)原理,涉及协程定义,生成器和yield语义,Future对象,ioloop对象,函数装饰器coroutine等相关内容,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • python实现二维码扫码自动登录淘宝

    python实现二维码扫码自动登录淘宝

    最近做项目,需要用到自动登录淘宝,正好在学习python,整网络爬虫,所以就尝试着写一个脚本,自动解决。有相同需求的小伙伴可以参考下
    2016-12-12
  • 对Python中plt的画图函数详解

    对Python中plt的画图函数详解

    今天小编就为大家分享一篇对Python中plt的画图函数详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11

最新评论