本文執行個體講述了Python實現字串的KMP演算法。分享給大家供大家參考,具體如下:
KMP演算法Python實現
今天研究KMP演算法,看來很多版本,有不同的語言寫的,但是感覺越看越亂,最後自己試著寫一份進行總結
首先,KMP演算法使字串匹配中的最佳化演算法,使原來的O(m*n)降到了O(m+n)
關於他的理解,我推薦先看視頻,他講的很清楚了。汪都能聽懂的KMP字串匹配演算法
然後從可視化方面理解,推薦看看如何更好的理解和掌握 KMP 演算法? - 佑子的回答 - 知乎容
最後從代碼層理解Searching for Patterns | Set 2 (KMP Algorithm)
代碼不要看太多別人的,我感覺好多人寫的也有問題,我在自己運行處問題時,有看有些同學寫的,被帶到其他坑裡了。。。
最後記錄代碼
'''先求next數組'''def next_list(pattern): next=[] pattern_list=list(pattern) j=0 i=1 for s in range(len(pattern)): #第一位一直是0 if s==0: next.append(0) #看第i個和第j個字母是否相同,如果相同,則累加 #同時i,j同時右移 elif(pattern_list[i]==pattern_list[j]): next.append(j+1) j+=1 i+=1 #如果不相同,則next為0,同時j也退回第一個位置,i繼續前進一個位置 else: next.append(0) j=0 i=s+1 print(next) return nextnext_list('ABABCABAB') def kmp(text,pattern): #text的位置 i=0 #pattern的位置 j=0 next=next_list(pattern) if(not(text and pattern)): print('字串為空白,請輸入字串') elif(len(text)<len(pattern)): print('原字串過小') elif(text==pattern): print('字串一致') else: while( (i<len(text) )): print((text[i],pattern[j])) print(i,j) #如果相同,則進行下一個對比 if( text[i]==pattern[j]): i+=1 j+=1 #判斷是不是匹配完了 if j==len(pattern): print('從第{0}個位置開始匹配'.format(i-j)) j=next[j-1] #如果不匹配,則j反回到前一個字母對應的next elif i<len(text) and text[i]!=pattern[j]: #我就是少了這個判斷,一直有問題,就是在不匹配後的第二步,後面這個很關鍵 if j!=0: #這個就是精髓了,如果不匹配,就去找第一個和這個匹配的字串,然後在這個前面的匹配字串 #的後一個字母拿出來,再與長text比較的第i個字母比較 j=next[j-1] #如果j已經回到了0,則通過增加i,text移動到下一個字母 else: i+=1# text = "ABABDABACDABABCABAB"# pattern = "ABABCABAB" text='abxabcabcaby'pattern='abcaby'kmp(text,pattern)#output:next=[0, 0, 0, 1, 2, 0]('a', 'a')0 0('b', 'b')1 1('x', 'a')2 0('a', 'a')3 0('b', 'b')4 1('c', 'c')5 2('a', 'a')6 3('b', 'b')7 4('c', 'c')8 2('a', 'a')9 3('b', 'b')10 4('y', 'y')11 5從第6個位置開始匹配
相關推薦:
KMP演算法最淺顯理解
kmp演算法詳解
KMP演算法中最難理解的地方的理解
kmp演算法原理及實現
圖解KMP演算法