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

本文详细介绍了如何使用Python实现KMP算法,并通过多个测试用例验证了其正确性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#! /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()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值