Python实现字符串匹配的KMP算法


Posted in Python onApril 04, 2019

kmp算法

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。

#! /usr/bin/python
# coding=utf-8
"""
基于这篇文章的python实现
http://blog.sae.sina.com.cn/archives/307
"""
import unittest
def pmt(s):
  """
  PartialMatchTable
  """
  prefix = [s[:i+1] for i in range(len(s)-1)]
  postfix = [s[i+1:] for i in range(len(s)-1)]
  intersection = list(set(prefix) & set(postfix))
  if intersection:
    return len(intersection[0])
  return 0
def kmp(big,small):
  i = 0
  while i < len(big) - len(small) + 1:
    match = True
    for j in range(len(small)):
      if big[i+j] != small[j]: 
        match = False
        break
    if match:
      return True
    #移动位数 = 已匹配的字符数 ? 对应的部分匹配值
    if j:
      i += j - pmt(small[:j])
    else:
      i += 1
  return False
class kmpTests(unittest.TestCase):
  def test_pmt(self):
    self.assertEqual(pmt("A"),0)
    self.assertEqual(pmt("AB"),0)
    self.assertEqual(pmt("ABC"),0)
    self.assertEqual(pmt("ABCD"),0)
    self.assertEqual(pmt("ABCDA"),1)
    self.assertEqual(pmt("ABCDAB"),2)
    self.assertEqual(pmt("ABCDABD"),0)
    self.assertEqual(pmt("AAAAAA"),5)
  def test_kmp(self):
    self.assertTrue(kmp("ABCD","CD"))
    self.assertFalse(kmp("ABCD","BD"))
    self.assertTrue(kmp("BBC ABCDAB ABCDABCDABDE","ABCDABD"))
if __name__ == '__main__':
  unittest.main()

总结

以上所述是小编给大家介绍的Python实现字符串匹配的KMP算法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python中global与nonlocal比较
Nov 21 Python
python实现的简单文本类游戏实例
Apr 28 Python
python绘制双柱形图代码实例
Dec 14 Python
一些Centos Python 生产环境的部署命令(推荐)
May 07 Python
解决seaborn在pycharm中绘图不出图的问题
May 24 Python
TensorFlow的权值更新方法
Jun 14 Python
Python2与Python3的区别实例总结
Apr 17 Python
Python3.5字符串常用操作实例详解
May 01 Python
python list数据等间隔抽取并新建list存储的例子
Nov 27 Python
opencv python Canny边缘提取实现过程解析
Feb 03 Python
python如何提取英语pdf内容并翻译
Mar 03 Python
python3 中使用urllib问题以及urllib详解
Aug 03 Python
Python GUI编程完整示例
Apr 04 #Python
Python使用sax模块解析XML文件示例
Apr 04 #Python
详解小白之KMP算法及python实现
Apr 04 #Python
Python魔法方法功能与用法简介
Apr 04 #Python
详解pandas.DataFrame中删除包涵特定字符串所在的行
Apr 04 #Python
pandas删除指定行详解
Apr 04 #Python
详解python之heapq模块及排序操作
Apr 04 #Python
You might like
《星际争霸2》终章已出 RTS时代宣告终结
2017/02/07 星际争霸
Yii框架实现邮箱激活的方法【数字签名】
2016/10/18 PHP
PHP的微信支付接口使用方法讲解
2019/03/08 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式二图文详解
2019/04/09 PHP
imagettftext() 失效,不起作用
2021/03/09 PHP
JQuyer $.post 与 $.ajax 访问WCF ajax service 时的问题需要注意的地方
2011/09/20 Javascript
Js中的onblur和onfocus事件应用介绍
2013/08/27 Javascript
如何让DIV可编辑、可拖动示例代码
2013/09/18 Javascript
使用pjax实现无刷新更改页面url
2015/02/05 Javascript
JavaScript中数据结构与算法(一):栈
2015/06/19 Javascript
浅谈js算法和流程控制
2016/12/29 Javascript
在vue里面设置全局变量或数据的方法
2018/03/09 Javascript
详解webpack 打包文件体积过大解决方案(code splitting)
2018/04/10 Javascript
在layui中对table中的数据进行判断(0、1)转换为提示信息的方法
2019/09/28 Javascript
微信小程序通过websocket实时语音识别的实现代码
2020/08/19 Javascript
js实现菜单跳转效果
2020/12/11 Javascript
python转换摩斯密码示例
2014/02/16 Python
python中WSGI是什么,Python应用WSGI详解
2017/11/24 Python
python根据unicode判断语言类型实例代码
2018/01/17 Python
浅谈关于Python3中venv虚拟环境
2018/08/01 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
2018/11/30 Python
python 随机打乱 图片和对应的标签方法
2018/12/14 Python
Python写出新冠状病毒确诊人数地图的方法
2020/02/12 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
2020/03/30 Python
python对指定字符串逆序的6种方法(小结)
2020/04/02 Python
Python运行提示缺少模块问题解决方案
2020/04/02 Python
css3.0 图形构成实例练习二
2013/03/19 HTML / CSS
html5 input属性使用示例
2013/06/28 HTML / CSS
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
Mixbook加拿大:照片书,照片卡,剪贴簿,年历和日历
2017/02/21 全球购物
小学领导班子对照材料
2014/08/23 职场文书
2014年学生资助工作总结
2014/12/18 职场文书
2019年暑期法院实习报告
2019/12/18 职场文书
nginx实现发布静态资源的方法
2021/03/31 Servers
Java并发编程必备之Future机制
2021/06/30 Java/Android
MySql分区类型及创建分区的方法
2022/04/13 MySQL