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之眼花缭乱的运算符
Sep 14 Python
Python自定义scrapy中间模块避免重复采集的方法
Apr 07 Python
python动态网页批量爬取
Feb 14 Python
一张图带我们入门Python基础教程
Feb 05 Python
Flask Web开发入门之文件上传(八)
Aug 17 Python
详解利用python+opencv识别图片中的圆形(霍夫变换)
Jul 01 Python
Python装饰器使用你可能不知道的几种姿势
Oct 25 Python
pymysql的简单封装代码实例
Jan 08 Python
Python 实现自动获取种子磁力链接方式
Jan 16 Python
使用TFRecord存取多个数据案例
Feb 17 Python
Pytorch中的自动求梯度机制和Variable类实例
Feb 29 Python
基于python爬取有道翻译过程图解
Mar 31 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/04/28 PHP
PHP容易被忽略而出错陷阱 数字与字符串比较
2011/11/10 PHP
php页码形式分页函数支持静态化地址及ajax分页
2014/03/28 PHP
PHP快速推送微信模板消息
2017/04/14 PHP
PHP使用zlib扩展实现GZIP压缩输出的方法详解
2018/04/09 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
2019/09/09 PHP
javascript实现的在当前窗口中漂浮框的代码
2010/03/15 Javascript
来自国外的14个图片放大编辑的jQuery插件整理
2010/10/20 Javascript
jquery 操作日期、星期、元素的追加的实现代码
2012/02/07 Javascript
js购物车实现思路及代码(个人感觉不错)
2013/12/23 Javascript
js重写alert控件(适合学习js的新手朋友)
2014/08/24 Javascript
javascript框架设计之种子模块
2015/06/23 Javascript
js print打印网页指定区域内容的简单实例
2016/11/01 Javascript
JavaScript中setTimeout的那些事儿
2016/11/14 Javascript
bootstrap table服务端实现分页效果
2017/08/10 Javascript
使用JavaScript实现在页面中显示距离2017年中秋节的天数
2017/09/26 Javascript
JavaScript 性能提升之路(推荐)
2019/04/10 Javascript
js防抖函数和节流函数使用场景和实现区别示例分析
2020/04/11 Javascript
JS图片懒加载技术实现过程解析
2020/07/27 Javascript
[00:56]PWL开团时刻DAY8——追追追追追!
2020/11/09 DOTA
Python交换变量
2008/09/06 Python
Python bsddb模块操作Berkeley DB数据库介绍
2015/04/08 Python
点球小游戏python脚本
2018/05/22 Python
python实现机器学习之多元线性回归
2018/09/06 Python
python实现将视频按帧读取到自定义目录
2019/12/10 Python
CK美国官网:Calvin Klein
2016/08/26 全球购物
商铺租赁意向书
2014/04/01 职场文书
计算机应用专业自荐信
2014/07/05 职场文书
商场周年庆活动方案
2014/08/19 职场文书
仰望星空观后感
2015/06/10 职场文书
消费者投诉书范文
2015/07/02 职场文书
学校财务管理制度
2015/08/04 职场文书
2016中秋节晚会开场白
2015/11/26 职场文书
区域销售大会开幕词
2016/03/04 职场文书
Vue elementUI表单嵌套表格并对每行进行校验详解
2022/02/18 Vue.js
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
2022/03/16 Redis