字串的KMP演算法 Python實現

2021-08-18 23:29:20 字數 2052 閱讀 8584

今天研究kmp演算法,看來很多版本,有不同的語言寫的,但是感覺越看越亂,最後自己試著寫乙份進行總結

首先,kmp演算法使字串匹配中的優化演算法,使原來的o(m*n)降到了o(m+n)

然後從視覺化方面理解,推薦看看如何更好的理解和掌握 kmp 演算法? - 佑子的回答 - 知乎容

最後從**層理解searching for patterns | set 2 (kmp algorithm)

**不要看太多別人的,我感覺好多人寫的也有問題,我在自己執行處問題時,有看有些同學寫的,被帶到其他坑里了。。。

最後記錄**

'''

先求next陣列

'''def

next_list

(pattern):

next=

pattern_list=list(pattern)

j=0i=1

for s in range(len(pattern)):

#第一位一直是0

if s==0:

#看第i個和第j個字母是否相同,如果相同,則累加

#同時i,j同時右移

elif(pattern_list[i]==pattern_list[j]):

j+=1

i+=1

#如果不相同,則next為0,同時j也退回第乙個位置,i繼續前進乙個位置

else:

j=0i=s+1

print(next)

return next

next_list('ababcabab')

defkmp

(text,pattern):

#text的位置

i=0#pattern的位置

j=0next=next_list(pattern)

if(not(text and pattern)):

print('字串為空,請輸入字串')

elif(len(text)'原字串過小')

elif(text==pattern):

print('字串一致')

else:

while( (i#如果相同,則進行下乙個對比

if( text[i]==pattern[j]):

i+=1

j+=1

#判斷是不是匹配完了

if j==len(pattern):

print('從第個位置開始匹配'.format(i-j))

j=next[j-1]

#如果不匹配,則j反回到前乙個字母對應的next

elif iand 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')00

('b', 'b')11

('x', 'a')20

('a', 'a')30

('b', 'b')41

('c', 'c')52

('a', 'a')63

('b', 'b')74

('c', 'c')82

('a', 'a')93

('b', 'b')104

('y', 'y')115

從第6個位置開始匹配

字串 KMP演算法

而kmp演算法在字串匹配方法中乙個很著名並且很聰明的演算法,當然也確實比較難理解。甚至於有程式設計師因為無法理解kmp演算法而直接改用暴力匹配。本身自己學演算法起步較晚,第一次接觸到kmp演算法已經是研究生畢業一年了。雖然帶著研究生的學歷背景,但是剛開始看的時候依然是一臉懵逼。看了很多博主的講解總算...

字串 KMP演算法

而kmp演算法在字串匹配方法中乙個很著名並且很聰明的演算法,當然也確實比較難理解。甚至於有程式設計師因為無法理解kmp演算法而直接改用暴力匹配。本身自己學演算法起步較晚,第一次接觸到kmp演算法已經是研究生畢業一年了。雖然帶著研究生的學歷背景,但是剛開始看的時候依然是一臉懵逼。看了很多博主的講解總算...

字串演算法 KMP演算法

給定字串m和n m比n長 找出n在m中出現的匹配位置。說白了,就是乙個簡單的字串匹配。例如 首先,字串 bbc abcdab abcdabcdabde 的第乙個字元與搜尋詞 abcdabd 的第乙個字元進行比較。因為b與a不匹配,所以搜尋詞後移一位。因為b與a不匹配,搜尋詞再往後移。就這樣,直到字串...