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实现端口转发器的方法
Mar 13 Python
python中import学习备忘笔记
Jan 24 Python
windows下安装Python和pip终极图文教程
Mar 05 Python
Python装饰器用法示例小结
Feb 11 Python
Python实现爬虫抓取与读写、追加到excel文件操作示例
Jun 27 Python
利用pandas读取中文数据集的方法
Jul 25 Python
Django框架模板文件使用及模板文件加载顺序分析
May 23 Python
Python实现蒙特卡洛算法小实验过程详解
Jul 12 Python
python django model联合主键的例子
Aug 06 Python
Python从文件中读取指定的行以及在文件指定位置写入
Sep 06 Python
使用Pyhton 分析酒店针孔摄像头
Mar 04 Python
如何一键升级Python所有包
Nov 05 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
自动生成文章摘要的代码[PHP 版本]
2007/03/20 PHP
php实现过滤表单提交中html标签的方法
2014/10/17 PHP
php使用Imagick生成图片的方法
2015/07/31 PHP
window.onbeforeunload方法在IE下无法正常工作的解决办法
2010/01/23 Javascript
有关于JS构造函数的重载和工厂方法
2013/04/07 Javascript
JavaScript在XHTML中的用法详解
2013/04/11 Javascript
jQuery插件开发精品教程(让你的jQuery更上一个台阶)
2015/11/07 Javascript
详解js中构造流程图的核心技术JsPlumb
2015/12/08 Javascript
详解JavaScript中localStorage使用要点
2016/01/13 Javascript
前端面试题及答案整理(二)
2016/08/26 Javascript
微信小程序 实现拖拽事件监听实例详解
2016/11/16 Javascript
JavaScript之WebSocket技术详解
2016/11/18 Javascript
原生JS实现跑马灯效果
2017/02/20 Javascript
详解Angular2中Input和Output用法及示例
2017/05/21 Javascript
js禁止浏览器页面后退功能的实例(推荐)
2017/09/01 Javascript
如何在 JavaScript 中更好地利用数组
2018/09/27 Javascript
JavaScript学习笔记之DOM操作实例分析
2019/01/08 Javascript
javascript实现贪吃蛇经典游戏
2020/04/10 Javascript
vue-router的hooks用法详解
2020/06/08 Javascript
python定时检查某个进程是否已经关闭的方法
2015/05/20 Python
Python的string模块中的Template类字符串模板用法
2016/06/27 Python
Python用Pillow(PIL)进行简单的图像操作方法
2017/07/07 Python
Python编程之Re模块下的函数介绍
2017/10/28 Python
用TensorFlow实现多类支持向量机的示例代码
2018/04/28 Python
Python根据成绩分析系统浅析
2019/02/11 Python
Python符号计算之实现函数极限的方法
2019/07/15 Python
python实现连连看辅助之图像识别延伸
2019/07/17 Python
纯CSS3绘制打火机动画火焰效果
2016/07/18 HTML / CSS
UGG澳洲官网:UGG Australia
2018/04/26 全球购物
Bally巴利中国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/10/09 全球购物
车间组长岗位职责
2013/12/20 职场文书
采购意向书范本
2014/03/31 职场文书
建筑投标担保书
2014/05/20 职场文书
市级三好学生事迹材料
2014/08/27 职场文书
校长四风对照检查材料
2014/09/27 职场文书
2015年教师节广播稿
2015/08/19 职场文书