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为什么不需要三目运算符和switch
Jun 17 Python
python OpenCV学习笔记之绘制直方图的方法
Feb 08 Python
使用Flask集成bootstrap的方法
Jul 24 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
Apr 11 Python
使用pytorch完成kaggle猫狗图像识别方式
Jan 10 Python
浅谈在JupyterNotebook下导入自己的模块的问题
Apr 16 Python
python多线程实现同时执行两个while循环的操作
May 02 Python
解决Keras自带数据集与预训练model下载太慢问题
Jun 12 Python
python使用nibabel和sitk读取保存nii.gz文件实例
Jul 01 Python
Python3获取cookie常用三种方案
Oct 05 Python
简述python&amp;pytorch 随机种子的实现
Oct 07 Python
写一个Python脚本自动爬取Bilibili小视频
Apr 24 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获取地址栏信息的代码
2008/10/08 PHP
PHP 获取MSN好友列表的代码(2009-05-14测试通过)
2009/09/09 PHP
PHP中ini_set和ini_get函数的用法小结
2014/02/18 PHP
php array_multisort 对数组进行排序详解及实例代码
2016/10/27 PHP
Laravel实现短信注册的示例代码
2018/05/29 PHP
基于jQuery的history历史记录插件
2010/12/11 Javascript
jquery1.5.1中根据元素ID获取元素对象的代码
2011/04/02 Javascript
JqGrid web打印实现代码
2011/05/31 Javascript
jquery $.each()使用探讨
2013/09/23 Javascript
jquery五角星评分插件示例分享
2014/02/21 Javascript
Javascript小技巧之生成html元素
2014/05/15 Javascript
详解Javascript动态操作CSS
2014/12/08 Javascript
javascript中Date()函数在各浏览器中的显示效果
2015/06/18 Javascript
jQuery实用技巧必备(下)
2015/11/03 Javascript
Javascript中的return作用及javascript return关键字用法详解
2015/11/05 Javascript
js中substr,substring,indexOf,lastIndexOf,split,replace的用法详解
2015/11/09 Javascript
JavaScript对象数组排序函数及六个用法
2015/12/23 Javascript
微信小程序 数据访问实例详解
2016/10/08 Javascript
jQuery滑动效果实现方法分析
2018/09/05 jQuery
详解如何使用微信小程序云函数发送短信验证码
2019/03/13 Javascript
利用JS响应式修改vue实现页面的input值
2019/09/02 Javascript
ant-design-vue 快速避坑指南(推荐)
2020/01/21 Javascript
vue递归获取父元素的元素实例
2020/08/07 Javascript
Docker部署Python爬虫项目的方法步骤
2020/01/19 Python
Python3批量创建Crowd用户并分配组
2020/05/20 Python
澳大利亚自然和有机的健康美容产品一站式商店:Ziani Beauty
2017/12/28 全球购物
Hotels.com印度:酒店预订
2019/05/11 全球购物
英国在线购买马术服装:EQUUS
2019/07/12 全球购物
班主任个人工作反思
2014/04/28 职场文书
三好学生评语大全
2014/12/29 职场文书
个园导游词
2015/02/04 职场文书
民间借贷被告代理词
2015/05/23 职场文书
2015年青年教师工作总结
2015/05/25 职场文书
2016大学优秀学生干部事迹材料
2016/03/01 职场文书
只需要这一行代码就能让python计算速度提高十倍
2021/05/24 Python
Mysql事务索引知识汇总
2022/03/17 MySQL