zoukankan      html  css  js  c++  java
  • 字符串匹配的KMP算法——Python实现

    #! /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()
  • 相关阅读:
    TinySpider开源喽
    TinyXmlParser开源喽
    Tiny快速入门之控制层开发
    TinyDBRouter
    TinyIOC
    开源前要做好哪些准备工作?
    分布式锁的简单实现
    TinyDBCluster Vs routing4db
    HTML5基础(五)
    HTML5基础(四)
  • 原文地址:https://www.cnblogs.com/goodspeed/p/3295456.html
Copyright © 2011-2022 走看看