您好,登錄后才能下訂單哦!
這篇文章主要介紹了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算法”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。