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类的__getitem__和__setitem__特殊方法
Dec 25 Python
用Python删除本地目录下某一时间点之前创建的所有文件的实例
Dec 14 Python
Matplotlib中文乱码的3种解决方案
Nov 15 Python
使用pygame写一个古诗词填空通关游戏
Dec 03 Python
在django中使用apscheduler 执行计划任务的实现方法
Feb 11 Python
python实现逆滤波与维纳滤波示例
Feb 26 Python
Python使用sqlite3模块内置数据库
May 07 Python
Python如何使用正则表达式爬取京东商品信息
Jun 01 Python
如何在mac下配置python虚拟环境
Jul 06 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
Aug 26 Python
python dict如何定义
Sep 02 Python
python自动打开浏览器下载zip并提取内容写入excel
Jan 04 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
LNMP部署laravel以及xhprof安装使用教程
2017/09/14 PHP
PHP面向对象类型约束用法分析
2019/06/12 PHP
禁止ajax缓存获取程序最新数据的方法
2013/11/19 Javascript
c#程序员对TypeScript的认识过程
2015/06/19 Javascript
js获取Html元素的实际宽度高度的方法
2016/05/19 Javascript
JS使用onerror捕获异常示例
2016/08/03 Javascript
jQuery实现的右下角广告窗体跟随效果示例
2016/09/16 Javascript
Angularjs 1.3 中的$parse实例代码
2017/09/14 Javascript
js将键值对字符串转为json字符串的方法
2018/03/30 Javascript
VUE接入腾讯验证码功能(滑块验证)备忘
2019/05/07 Javascript
使用watch在微信小程序中实现全局状态共享
2019/06/03 Javascript
javascript 构建模块化开发过程解析
2019/09/11 Javascript
js实现查询商品案例
2020/07/22 Javascript
vue实现tab栏点击高亮效果
2020/08/19 Javascript
js实现简易ATM功能
2020/10/27 Javascript
vue+swiper实现左右滑动的测试题功能
2020/10/30 Javascript
vue vant中picker组件的使用
2020/11/03 Javascript
微信小程序中target和currentTarget的区别小结
2020/11/06 Javascript
[51:11]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS DT
2014/05/22 DOTA
python3.3教程之模拟百度登陆代码分享
2014/01/16 Python
python控制台显示时钟的示例
2014/02/24 Python
python判断字符串是否纯数字的方法
2014/11/19 Python
分享Python字符串关键点
2015/12/13 Python
python3 实现的人人影视网站自动签到
2016/06/19 Python
Python爬取网页中的图片(搜狗图片)详解
2017/03/23 Python
Tornado高并发处理方法实例代码
2018/01/15 Python
解决python3读取Python2存储的pickle文件问题
2018/10/25 Python
解决Pandas的DataFrame输出截断和省略的问题
2019/02/08 Python
python集合常见运算案例解析
2019/10/17 Python
Python实现名片管理系统
2020/02/14 Python
matplotlib自定义鼠标光标坐标格式的实现
2021/01/08 Python
使用CSS3创建动态菜单效果
2015/07/10 HTML / CSS
英国领先的大码时装品牌之一:Elvi
2018/08/26 全球购物
聘任书模板
2014/03/29 职场文书
多人盗宝《绿林侠盗》第三赛季4.5上线 跨平台实装
2022/04/03 其他游戏
SpringBoot中获取profile的方法详解
2022/04/08 Java/Android