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串的第...