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中的struct模块
Apr 28 Python
python使用os.listdir和os.walk获得文件的路径的方法
Dec 16 Python
使用 Python 实现微信公众号粉丝迁移流程
Jan 03 Python
python 给DataFrame增加index行名和columns列名的实现方法
Jun 08 Python
简单分析python的类变量、实例变量
Aug 23 Python
Tensorflow实现部分参数梯度更新操作
Jan 23 Python
python默认参数调用方法解析
Feb 09 Python
python实现人机五子棋
Mar 25 Python
Python 如何在字符串中插入变量
Aug 01 Python
Python+kivy BoxLayout布局示例代码详解
Dec 28 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
Jan 21 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
Mar 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
PHP查询MySQL大量数据的时候内存占用分析
2011/07/22 PHP
PHP 循环删除无限分类子节点的实现代码
2013/06/21 PHP
PHP实现的购物车类实例
2015/06/17 PHP
PHP使用PHPexcel导入导出数据的方法
2015/11/14 PHP
体验js中splice()的强大(插入、删除或替换数组的元素)
2013/01/16 Javascript
JavaScript学习心得之概述
2015/01/20 Javascript
jQuery树形下拉菜单特效代码分享
2015/08/15 Javascript
Jquery实现的简单轮播效果【附实例】
2016/04/19 Javascript
AngularJS 遇到的小坑与技巧小结
2016/06/07 Javascript
使用JavaScript获取Request中参数的值方法
2016/09/27 Javascript
微信小程序 获取设备信息 API实例详解
2016/10/02 Javascript
使用BootStrap和Metroui设计的metro风格微网站或手机app界面
2016/10/21 Javascript
微信小程序中post方法与get方法的封装
2017/09/26 Javascript
实例解析ES6 Proxy使用场景介绍
2018/01/08 Javascript
vue 登录滑动验证实现代码
2018/08/24 Javascript
详解webpack+ES6+Sass搭建多页面应用
2018/11/05 Javascript
基于vue实现移动端圆形旋钮插件效果
2018/11/28 Javascript
vue项目引入ts步骤(小结)
2019/10/31 Javascript
es6数组之扩展运算符操作实例分析
2020/04/25 Javascript
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
python实现多线程抓取知乎用户
2016/12/12 Python
python3制作捧腹网段子页爬虫
2017/02/12 Python
python实现ID3决策树算法
2018/08/29 Python
使用pyqt 实现重复打开多个相同界面
2019/12/13 Python
linux 下python多线程递归复制文件夹及文件夹中的文件
2020/01/02 Python
Python优秀开源项目Rich源码解析的流程分析
2020/07/06 Python
Python Http请求json解析库用法解析
2020/11/28 Python
鲜为人知的HTML5语音合成功能
2019/05/17 HTML / CSS
美国时装品牌:Nautica(诺帝卡)
2016/08/28 全球购物
C语言编程练习
2012/04/02 面试题
大学毕业感言100字
2014/02/03 职场文书
优秀辅导员事迹材料
2014/02/16 职场文书
特教教师先进事迹
2014/05/21 职场文书
我的中国心演讲稿
2014/09/04 职场文书
小学语文教学反思范文
2016/03/03 职场文书
500字作文之周记
2019/12/13 职场文书