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实现倒计时的示例
Feb 14 Python
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
Mar 06 Python
Python线程中对join方法的运用的教程
Apr 09 Python
怎么使用pipenv管理你的python项目
Mar 12 Python
Python使用Windows API创建窗口示例【基于win32gui模块】
May 09 Python
python 遍历目录(包括子目录)下所有文件的实例
Jul 11 Python
python爬虫之urllib库常用方法用法总结大全
Nov 14 Python
Python中利用aiohttp制作异步爬虫及简单应用
Nov 29 Python
python如何删除文件中重复的字段
Jul 16 Python
Django获取该数据的上一条和下一条方法
Aug 12 Python
Python入门基础之数字字符串与列表
Feb 01 Python
Python - 10行代码集2000张美女图
May 23 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 __autoload()方法真的影响性能吗?
2012/03/30 PHP
php判断当前操作系统类型
2015/10/28 PHP
PHPMailer发送邮件
2016/12/28 PHP
PHP PDO和消息队列的个人理解与应用实例分析
2019/11/25 PHP
关于jquery性能最佳实践的讨论,与求教
2012/03/30 Javascript
ie6下png图片背景不透明的解决办法使用js实现
2013/01/11 Javascript
javascript间隔刷新的简单实例
2013/11/14 Javascript
js showModalDialog 弹出对话框的简单实例(子窗体)
2014/01/07 Javascript
input禁止键盘及中文输入,但可以点击
2014/02/13 Javascript
JavaScript利用构造函数和原型的方式模拟C#类的功能
2014/03/06 Javascript
jQuery中DOM树操作之复制元素的方法
2015/01/23 Javascript
javascript实现获取字符串hash值
2015/05/10 Javascript
对Js OOP编程 创建对象的一些全面理解
2016/07/26 Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
2016/07/28 Javascript
微信小程序 页面传值详解
2017/03/10 Javascript
js获取css的各种样式并且设置他们的方法
2017/08/22 Javascript
React实践之Tree组件的使用方法
2017/09/30 Javascript
vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法
2018/01/25 Javascript
JavaScript 下载svg图片为png格式
2018/06/21 Javascript
vue模块移动组件的实现示例
2020/05/20 Javascript
vue.js页面加载执行created,mounted的先后顺序说明
2020/11/07 Javascript
纯Python开发的nosql数据库CodernityDB介绍和使用实例
2014/10/23 Python
Python日志模块logging基本用法分析
2018/08/23 Python
Python中反射和描述器总结
2018/09/23 Python
详解pyppeteer(python版puppeteer)基本使用
2019/06/12 Python
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
Python random模块的使用示例
2020/10/10 Python
客户表扬信范文
2014/01/10 职场文书
致跳远运动员加油稿
2014/02/11 职场文书
安全生产先进个人事迹材料
2014/12/30 职场文书
2015年行政助理工作总结
2015/04/30 职场文书
2016同学毕业寄语大全
2015/12/04 职场文书
导游词幽默开场白
2019/06/26 职场文书
四年级作文之说明文作文
2019/10/14 职场文书
pandas取dataframe特定行列的实现方法
2021/05/24 Python
Python列表的索引与切片
2022/04/07 Python