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中的字典遍历备忘
Jan 17 Python
Python批量按比例缩小图片脚本分享
May 21 Python
Python检测字符串中是否包含某字符集合中的字符
May 21 Python
Python OS模块常用函数说明
May 23 Python
详解Python函数可变参数定义及其参数传递方式
Aug 02 Python
python中numpy的矩阵、多维数组的用法
Feb 05 Python
Python Numpy 数组的初始化和基本操作
Mar 13 Python
python操作excel的方法
Aug 16 Python
详解解决Python memory error的问题(四种解决方案)
Aug 08 Python
使用pyqt 实现重复打开多个相同界面
Dec 13 Python
浅析Python3 pip换源问题
Jan 06 Python
解决Django Haystack全文检索为空的问题
May 19 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
盘点被央视点名过的日本动画电影 一部比一部强
2020/03/08 日漫
一个取得文件扩展名的函数
2006/10/09 PHP
PHP之短标签开启设置
2013/06/17 PHP
php生成百度sitemap站点地图类函数实例
2014/10/17 PHP
PHP获取数组的键与值方法小结
2015/06/13 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
2015/07/31 PHP
CodeIgniter配置之database.php用法实例分析
2016/01/20 PHP
file模式访问网页时iframe高度自适应解决方案
2013/01/16 Javascript
使用jQuery判断浏览器滚动条位置的方法
2016/05/30 Javascript
jQuery原理系列-css选择器的简单实现
2016/06/07 Javascript
浅谈$_FILES数组为空的原因
2017/02/16 Javascript
jquery Form轻松实现文件上传
2017/05/24 jQuery
微信小程序使用video组件播放视频功能示例【附源码下载】
2017/12/08 Javascript
几个你不知道的技巧助你写出更优雅的vue.js代码
2018/06/11 Javascript
详解VUE Element-UI多级菜单动态渲染的组件
2019/04/25 Javascript
vue实现树形结构样式和功能的实例代码
2019/10/15 Javascript
jQuery实现轮播图源码
2019/10/23 jQuery
功能完善的小程序日历组件的实现
2020/03/31 Javascript
Python编程在flask中模拟进行Restful的CRUD操作
2018/12/28 Python
python 实现UTC时间加减的方法
2018/12/31 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
2020/02/12 Python
基于Python快速处理PDF表格数据
2020/06/03 Python
CSS3的 fit-content实现水平居中
2017/09/07 HTML / CSS
关于前端上传文件全面基础扫盲贴(入门)
2019/08/01 HTML / CSS
html5指南-1.html5全局属性(html5 global attributes)深入理解
2013/01/07 HTML / CSS
护理专业个人求职简历的自我评价
2013/10/13 职场文书
年度考核自我鉴定
2013/11/09 职场文书
基本公共卫生服务健康教育工作方案
2014/05/22 职场文书
公共艺术专业自荐信
2014/09/01 职场文书
自主招生自荐信怎么写
2015/03/24 职场文书
法定代表人资格证明书
2015/06/18 职场文书
小学运动会通讯稿
2015/07/18 职场文书
物业公司管理制度
2015/08/05 职场文书
导游词之长城八达岭
2019/09/24 职场文书
Python 文字识别
2022/05/11 Python
MySQL约束(创建表时的各种条件说明)
2022/06/21 MySQL