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操作ie登陆土豆网的方法
May 09 Python
Python 中 Meta Classes详解
Feb 13 Python
python批量替换多文件字符串问题详解
Apr 22 Python
pandas DataFrame实现几列数据合并成为新的一列方法
Jun 08 Python
python2与python3共存问题的解决方法
Sep 18 Python
Mac下Anaconda的安装和使用教程
Nov 29 Python
对Python生成汉字字库文字,以及转换为文字图片的实例详解
Jan 29 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
May 31 Python
使用python实现回文数的四种方法小结
Nov 24 Python
Python实现队列的方法示例小结【数组,链表】
Feb 22 Python
python导入库的具体方法
Jun 18 Python
Python 数据的累加与统计的示例代码
Aug 03 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
第九节 绑定 [9]
2006/10/09 PHP
PHP解码unicode编码的中文字符代码分享
2014/08/13 PHP
PHP+MySQL实现的简单投票系统实例
2016/02/24 PHP
PHP中PDO的事务处理分析
2016/04/07 PHP
php实现的网页版剪刀石头布游戏示例
2016/11/25 PHP
php断点续传之文件分割合并详解
2016/12/13 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
XRegExp 0.2: Now With Named Capture
2007/11/30 Javascript
Firefox+FireBug使JQuery的学习更加轻松愉快
2010/01/01 Javascript
写出高效jquery代码的19条指南
2014/03/19 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/08/22 Javascript
Java Mybatis框架入门基础教程
2015/09/21 Javascript
window.onload绑定多个事件的两种解决方案
2016/05/15 Javascript
form表单转Json提交的方法(推荐)
2016/09/23 Javascript
vue2实现搜索结果中的搜索关键字高亮的代码
2018/08/29 Javascript
AngularJS动态生成select下拉框的方法实例
2019/11/17 Javascript
jQuery-App输入框实现实时搜索
2020/11/19 jQuery
Python Web框架Flask信号机制(signals)介绍
2015/01/01 Python
tensorflow更改变量的值实例
2018/07/30 Python
python递归实现快速排序
2018/08/18 Python
python3使用matplotlib绘制条形图
2020/03/25 Python
python基础知识(一)变量与简单数据类型详解
2019/04/17 Python
Python2和Python3中@abstractmethod使用方法
2020/02/04 Python
Python Numpy 控制台完全输出ndarray的实现
2020/02/19 Python
Python判断三段线能否构成三角形的代码
2020/04/12 Python
python实现批处理文件
2020/07/28 Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
2021/01/28 Python
canvas 基础之图像处理的使用
2020/04/10 HTML / CSS
少儿节目主持串词
2014/04/02 职场文书
停车场管理协议书范本
2014/10/08 职场文书
2015年绩效考核工作总结
2015/05/23 职场文书
唐山大地震观后感
2015/06/05 职场文书
汤姆索亚历险记读书笔记
2015/06/29 职场文书
教你怎么用Python监控愉客行车程
2021/04/29 Python
pyqt5蒙版遮罩mask,setmask的使用
2021/06/11 Python
解决Windows Server2012 R2 无法安装 .NET Framework 3.5
2022/04/29 Servers