python字符串匹配算法_Python实现字符串匹配的KMP算法

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算法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值