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