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 list中append()与extend()用法分享
Mar 24 Python
详解python调度框架APScheduler使用
Mar 28 Python
Python 获得13位unix时间戳的方法
Oct 20 Python
浅谈tensorflow1.0 池化层(pooling)和全连接层(dense)
Apr 27 Python
pandas 对每一列数据进行标准化的方法
Jun 09 Python
python中使用psutil查看内存占用的情况
Jun 11 Python
QML使用Python的函数过程解析
Sep 26 Python
如何利用Python动态模拟太阳系运转
Sep 04 Python
基于Pytorch版yolov5的滑块验证码破解思路详解
Feb 25 Python
python文件名批量重命名脚本实例代码
Apr 22 Python
Python合并多张图片成PDF
Jun 09 Python
分享提高 Python 代码的可读性的技巧
Mar 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
PHP array_multisort()函数的使用札记
2011/07/03 PHP
php中的注释、变量、数组、常量、函数应用介绍
2012/11/16 PHP
PHP调用VC编写的COM组件实例
2014/03/29 PHP
ThinkPHP控制器里javascript代码不能执行的解决方法
2014/11/22 PHP
php实现比较两个字符串日期大小的方法
2015/05/12 PHP
PHP命名空间和自动加载类
2016/04/03 PHP
PHP 绘制网站登录首页图片验证码
2016/04/12 PHP
PHP+Redis 消息队列 实现高并发下注册人数统计的实例
2018/01/29 PHP
Yii2框架控制器、路由、Url生成操作示例
2019/05/27 PHP
ExtJS Ext.MessageBox.alert()弹出对话框详解
2010/04/02 Javascript
jquery Mobile入门—外部链接切换示例代码
2013/01/08 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
2014/04/14 Javascript
全面兼容的javascript时间格式化函数(比较实用)
2014/05/14 Javascript
使用javascript实现雪花飘落的效果
2015/01/13 Javascript
jQuery Validate插件实现表单强大的验证功能
2015/12/18 Javascript
JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法
2016/08/03 Javascript
完美解决JS文件页面加载时的阻塞问题
2016/12/18 Javascript
Bootstrap按钮组实例详解
2017/07/03 Javascript
微信小程序实现MUI数字输入框效果
2018/01/31 Javascript
解决Vue.js 2.0 有时双向绑定img src属性失败的问题
2018/03/14 Javascript
详解react-refetch的使用小例子
2019/02/15 Javascript
layer.open 子页面弹出层向父页面传输数据的例子
2019/09/26 Javascript
JavaScript canvas实现雨滴特效
2021/01/10 Javascript
[02:38]DOTA2亚洲邀请赛小组赛精彩集锦:Wings完美团击溃对手
2017/03/29 DOTA
Python用list或dict字段模式读取文件的方法
2017/01/10 Python
PyQt5每天必学之创建窗口居中效果
2018/04/19 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
2020/01/05 Python
Python 生成短8位唯一id实战教程
2021/01/13 Python
python读取图片颜色值并生成excel像素画的方法实例
2021/02/19 Python
H5 meta小结(前端必看篇)
2016/08/24 HTML / CSS
香港太阳眼镜网上商店:SmartBuyGlasses香港
2016/07/22 全球购物
香港现代设计家具品牌:Ziinlife Furniture
2018/11/13 全球购物
WEB控件及HTML服务端控件能否调用客户端方法?如果能,请解释如何调用?
2015/08/25 面试题
《桃林那间小木屋》教学反思
2014/05/01 职场文书
行政专员岗位职责说明书
2014/09/01 职场文书
刑事上诉状(无罪)
2015/05/23 职场文书