KMP 字串匹配

2021-09-27 04:07:50 字數 1375 閱讀 3543

kmp講解**於

問題:給定乙個主串s和乙個模式串p,要求找出p在s**現的位置,即字串匹配問題。

解決方法:

對於字串匹配,首先會想到暴力求解法,,但是這樣效率會比較低。對於主串s和模式串p,在移動p的過程中,可能會出現部分匹配的情況,就是匹配了p的真字首。如果是暴力法,碰到這種不匹配的情況,應該直接會讓模式串在向後移動一位,而在kmp中,我們考慮到了字串中已經匹配了部分字首的已知資訊,不要將「搜尋位置「移動回已經比較過的位置,跳過一定不會成功的部分,這樣就提高了效率。

字串p移動的位置根據next表(部分匹配表)來確定。

next表根據s的子串中字首和字尾重合的個數求得。

移動的步數 = 已經匹配的個數 - next表中對應匹配值

使用python實現:

def nextlist(s):

l = len(s)

print(l)

nextlist = [0]

if l == 1:

return nextlist

for i in range(1,l):

ll = 0

for j in range(0,i):

if s[0:j+1] == s[:i+1][-j-1:]:#判斷等長度的真字首與真字尾相同

ll= len(s[0:j+1])

return nextlist

def kmp(s,p):

next1 = nextlist(p)

print(next1)

ls = len(s)

lp = len(p)

result = -1

i = 0

j = 0

if ls == 0:

return -1

elif lp == 0:

return 0

while i < ls and j < lp:

if s[i] == p[j]:

i += 1

j += 1

else:

if j == 0:

i += 1

else :

j = next1[j-1]

if j == lp:

result = i - j

return result

if __name__ == "__main__":

s = "bbc abcdab abcdabcdabde"

p = "abcdabd"

print(kmp(s,p))

但是在leetcode上超時

kmp字串匹配

首先要對模式串進行預處理。預處理過程就是計算出指定位置的字首和字尾的最大相同的長度 啊啊啊啊。估計只有我乙個人能看懂 這個文章說得很清楚 比如說 a a a c b c a a a 0 1 2 0 0 0 1 2 3 void getnext int next,char par 20 int n 翻...

字串匹配 KMP

參考 從頭到尾徹底理解kmp 在字串 str 中 匹配模式串 pattern 1.計算模式串的 next 陣列 2.在字串中匹配模式串 當乙個字元匹配時,str i pattern k 繼續匹配下乙個字元 當當前字元不匹配時,根據 next 陣列移動模式字串,k next k next 陣列 描述模...

KMP字串匹配

判斷s中是否含有字串t。一般思路為 從s中首字元開始,依次與t中進行比對,直到t結尾或者某乙個位置兩者不同 如果到t的結尾,則表示s中含有t。如果有乙個位置不相同,那麼從s中下乙個字元開始,再次與t中字元比對。如下 i 0,j 0 for i len 這樣的比較,每一次遇到不同的時候都需要從t串的第...