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使用pil生成缩略图的方法
Mar 26 Python
Python下的Softmax回归函数的实现方法(推荐)
Jan 26 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
Jul 11 Python
pandas中的DataFrame按指定顺序输出所有列的方法
Apr 10 Python
python 字符串和整数的转换方法
Jun 25 Python
python3调用百度翻译API实现实时翻译
Aug 16 Python
简单分析python的类变量、实例变量
Aug 23 Python
通过Python编写一个简单登录功能过程解析
Sep 04 Python
python实现的读取网页并分词功能示例
Oct 29 Python
python 计算积分图和haar特征的实例代码
Nov 20 Python
python读取文件指定行内容实例讲解
Mar 02 Python
Python爬虫实战之爬取京东商品数据并实实现数据可视化
Jun 07 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
递归列出所有文件和目录
2006/10/09 PHP
Banner程序
2006/10/09 PHP
PHP7创建销毁session的实例方法
2020/02/03 PHP
javascript模仿msgbox提示效果代码
2008/06/10 Javascript
javascript 动态table添加colspan\rowspan 参数的方法
2009/07/25 Javascript
javascript 解析url的search方法
2010/02/09 Javascript
在JS数组特定索引处指定位置插入元素
2014/07/27 Javascript
Javascript常用字符串判断函数代码分享
2014/12/08 Javascript
javascript实现3D切换焦点图
2015/10/16 Javascript
JS实现的3D拖拽翻页效果代码
2015/10/31 Javascript
基于Vue-Cli 打包自动生成/抽离相关配置文件的实现方法
2018/12/09 Javascript
layui实现二维码弹窗、并下载到本地的方法
2019/09/25 Javascript
JS实现可控制的进度条
2020/03/25 Javascript
如何在 ant 的table中实现图片的渲染操作
2020/10/28 Javascript
JavaScript实现滑块验证解锁
2021/01/07 Javascript
python使用mysql数据库示例代码
2017/05/21 Python
python爬虫入门教程--优雅的HTTP库requests(二)
2017/05/25 Python
Python入门必须知道的11个知识点
2018/03/21 Python
python中subprocess批量执行linux命令
2018/04/27 Python
python实现随机漫步算法
2018/08/27 Python
对python中GUI,Label和Button的实例详解
2019/06/27 Python
如何利用python读取micaps文件详解
2020/10/18 Python
python 利用Pyinstaller打包Web项目
2020/10/23 Python
CSS3 实现发光边框特效
2020/11/11 HTML / CSS
美国高端婴童品牌:Hanna Andersson
2016/10/30 全球购物
do you have any Best Practice for testing
2016/06/04 面试题
大学生入党自我鉴定
2013/10/31 职场文书
课程设计心得体会
2013/12/28 职场文书
幸福家庭事迹材料
2014/02/03 职场文书
自主招生自荐信指南
2014/02/04 职场文书
医生爱岗敬业演讲稿
2014/08/26 职场文书
见习报告的格式
2014/11/04 职场文书
学生检讨书怎么写
2015/05/07 职场文书
python基础之类方法和静态方法
2021/10/24 Python
教你使用VS Code的MySQL扩展管理数据库的方法
2022/01/22 MySQL
使用Redis做预定库存缓存功能
2022/04/02 Redis