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中设置变量访问权限的方法
Apr 27 Python
Python中的random()方法的使用介绍
May 15 Python
Python基于csv模块实现读取与写入csv数据的方法
Jan 18 Python
如何使用Python实现自动化水军评论
Jun 26 Python
解决python super()调用多重继承函数的问题
Jun 26 Python
使用Rasterio读取栅格数据的实例讲解
Nov 26 Python
python3 循环读取excel文件并写入json操作
Jul 14 Python
Python自动发送和收取邮件的方法
Aug 12 Python
Python之字典对象的几种创建方法
Sep 30 Python
python调用有道智云API实现文件批量翻译
Oct 10 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
Dec 11 Python
Pytorch 如何实现常用正则化
May 27 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扩展介绍与开发教程
2010/08/19 PHP
php+mysqli事务控制实现银行转账实例
2015/01/29 PHP
Thinkphp框架中D方法与M方法的区别
2016/12/23 PHP
Swoole4.4协程抢占式调度器详解
2019/05/23 PHP
extJs 下拉框联动实现代码
2010/04/09 Javascript
JavaScript Accessor实现说明
2010/12/06 Javascript
javascript时间函数基础介绍
2013/03/28 Javascript
JS小功能(操作Table--动态添加删除表格及数据)实现代码
2013/11/28 Javascript
js实现可折叠展开的手风琴菜单效果
2015/09/07 Javascript
jQuery中hover与mouseover和mouseout的区别分析
2015/12/24 Javascript
下雪了 javascript实现雪花飞舞
2020/08/02 Javascript
原生js实现轮播图
2017/02/27 Javascript
js中less常用的方法小结
2017/08/09 Javascript
最适应的vue.js的form提交涉及多种插件【推荐】
2018/08/27 Javascript
JavaScript对象的特性与实践应用深入详解
2018/12/30 Javascript
[33:15]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VP VS Mineski
2018/03/31 DOTA
Python中自定义函数的教程
2015/04/27 Python
Python 2与Python 3版本和编码的对比
2017/02/14 Python
Python List cmp()知识点总结
2019/02/18 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
详解python项目实战:模拟登陆CSDN
2019/04/04 Python
Python面向对象之类和实例用法分析
2019/06/08 Python
详解python实现交叉验证法与留出法
2019/07/11 Python
通过python改变图片特定区域的颜色详解
2019/07/15 Python
Python流程控制 if else实现解析
2019/09/02 Python
pandas中遍历dataframe的每一个元素的实现
2019/10/23 Python
python代码中怎么换行
2020/06/17 Python
Django2.1.7 查询数据返回json格式的实现
2020/12/29 Python
施华洛世奇巴西官网:SWAROVSKI巴西
2019/12/03 全球购物
妈妈的账单教学反思
2014/02/06 职场文书
一年级评语大全
2014/04/23 职场文书
公安局负责人查摆问题及整改方案
2014/09/27 职场文书
高三复习计划
2015/01/19 职场文书
反邪教学习心得体会
2016/01/15 职场文书
Typescript类型系统FLOW静态检查基本规范
2022/05/25 Javascript
Python Matplotlib绘制动画的代码详解
2022/05/30 Python