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之import机制详解
Jul 03 Python
python处理文本文件实现生成指定格式文件的方法
Jul 31 Python
查看django版本的方法分享
May 14 Python
python爬虫超时的处理的实例
Dec 19 Python
python实现手机销售管理系统
Mar 19 Python
python二进制文件的转译详解
Jul 03 Python
python爬取盘搜的有效链接实现代码
Jul 20 Python
使用Pandas对数据进行筛选和排序的实现
Jul 29 Python
解决Djang2.0.1中的reverse导入失败的问题
Aug 16 Python
Python文件时间操作步骤代码详解
Apr 13 Python
Scrapy 配置动态代理IP的实现
Sep 28 Python
Python尝试实现蒙特卡罗模拟期权定价
Apr 21 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数据浏览器
2007/03/11 PHP
CodeIgniter php mvc框架 中国网站
2008/05/26 PHP
php 验证码(倾斜,正弦干扰线,黏贴,旋转)
2013/06/29 PHP
php pthreads多线程的安装与使用
2016/01/19 PHP
二级域名转向类
2006/11/09 Javascript
Javascript动态引用CSS文件的2种方法介绍
2014/06/06 Javascript
在JS数组特定索引处指定位置插入元素的技巧
2014/08/24 Javascript
一款基jquery超炫的动画导航菜单可响应单击事件
2014/11/02 Javascript
jQuery中:first-child选择器用法实例
2014/12/31 Javascript
node-webkit打包成exe文件被360误报木马的解决方法
2015/03/11 Javascript
Sublime Text 3常用插件及安装方法
2015/12/16 Javascript
利用jQuery实现滑动开关按钮效果(附demo源码下载)
2017/02/07 Javascript
js获取浏览器和屏幕的各种宽度高度
2017/02/22 Javascript
JS+DIV实现的卷帘效果示例
2017/03/22 Javascript
EasyUI中的dataGrid的行内编辑
2017/06/22 Javascript
JS实现的全排列组合算法示例
2017/10/09 Javascript
解决微信小程序云开发中获取数据库的内容为空的方法
2019/05/15 Javascript
vue data有值,但是页面{{}} 取不到值的解决
2020/11/09 Javascript
图文讲解选择排序算法的原理及在Python中的实现
2016/05/04 Python
详解Python中使用base64模块来处理base64编码的方法
2016/07/01 Python
django使用xlwt导出excel文件实例代码
2018/02/06 Python
利用python实现PSO算法优化二元函数
2019/11/13 Python
Python如何操作office实现自动化及win32com.client的运用
2020/04/01 Python
pandas DataFrame运算的实现
2020/06/14 Python
2021年的Python 时间轴和即将推出的功能详解
2020/07/27 Python
植村秀美国官网:Shu Uemura美国
2019/03/19 全球购物
见习期自我鉴定
2013/11/07 职场文书
幼儿园区域活动总结
2014/05/08 职场文书
个人工作主要事迹
2014/05/08 职场文书
应届生求职信
2014/05/31 职场文书
企业消防安全责任书
2014/07/23 职场文书
车辆年审委托书范本
2014/09/18 职场文书
2014年个人工作总结范文
2014/11/07 职场文书
实习单位推荐信
2015/03/27 职场文书
2015年政协委员工作总结
2015/05/20 职场文书
民间借贷借条范本
2015/05/25 职场文书