Python实现字符串匹配的KMP算法

作者:Goodspeed 时间:2021-02-10 05:03:45 

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算法网站的支持!

来源:https://www.cnblogs.com/goodspeed/p/3295456.html

标签:python,字符串,kmp
0
投稿

猜你喜欢

  • python去除列表中的空值元素实战技巧

    2023-12-08 12:16:06
  • Keras之fit_generator与train_on_batch用法

    2021-07-10 18:19:31
  • Python光学仿真之对光的干涉理解学习

    2021-05-24 04:47:52
  • 正则表达式字面量在ECMAScript5中的变化

    2012-04-26 16:23:16
  • Oracle数据库由dataguard备库引起的log file sync等待问题

    2023-07-17 07:35:25
  • Django开发中的日志输出的方法

    2023-02-24 07:37:17
  • Python实现队列的方法示例小结【数组,链表】

    2023-09-27 13:52:11
  • Python性能优化的20条建议

    2021-05-20 15:24:12
  • Python使用progressbar模块实现的显示进度条功能

    2023-11-20 05:40:07
  • python十进制和二进制的转换方法(含浮点数)

    2021-04-03 02:26:24
  • 对python中的控制条件、循环和跳出详解

    2022-03-08 00:41:44
  • python实现与redis交互操作详解

    2022-07-07 17:37:18
  • 显示ASP页面源码的代码

    2008-10-12 13:05:00
  • Python中判断input()输入的数据的类型

    2023-03-14 17:02:15
  • Python字符串查找基本操作代码案例

    2023-12-03 04:04:56
  • 网页中常用数字/字母序号与代码对照表

    2009-03-19 14:00:00
  • JavaScript设计模式之模板方法模式原理与用法示例

    2024-02-24 02:17:20
  • Django {{ MEDIA_URL }}无法显示图片的解决方式

    2023-06-20 07:42:22
  • 在python plt图表中文字大小调节的方法

    2021-04-21 04:40:28
  • 微信小程序实现滑动删除效果

    2024-04-19 10:03:45
  • asp之家 网络编程 m.aspxhome.com