今天研究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不匹配,搜尋詞再往後移。就這樣,直到字串...