字串匹配問題 KMP演算法

2021-07-27 00:11:14 字數 1071 閱讀 5604

kmp演算法

kmp是解字串匹配這類題目的演算法,又稱「看毛片」演算法。

如下圖,給定乙個長度為n的文字,給定乙個長度為m 的字串,求該字串在給定文字的中出現的次數。kmp就是解決這一類題目的。

i 1

zzkzzzkzzzkzkkkz

zzkzzkzzkzzk

j 1繼續考慮上面的問題。首先我相信每個人都有乙個笨蛋的想法,就是列舉在文字的起始位置i,然後把字串從這個位置開始乙個乙個對比,如果遇到某一位j不相同就停止並i++,重新開始對比。這樣的效率最壞的情況為o(m(n-1)),很不優秀。kmp其實就是基於這個笨蛋思想的優化。

i 6

a zzkzzzkzzzkzkkkz

b zzkzzkzzkzzk

j 5我們可以假設當前對比文字位置i,字串已經比較了j位,如果i和j+1不同其實我們不需要重新開始匹配,如果基於原來的基礎之上,稍微將字串往後移一移,這樣j可以保留一定的位置,效率上得到提公升。但是新位置還是要滿足匹配,所以就要尋找乙個最大的j』滿足b[1..j』]和 a[i-j』+1..i]一致,然後繼續用j』+1和i進行比較,如果不滿足就繼續進行以上過程。基本過程如下。

i 6

a zzkzzzkzzzkzkkkz

b zzkzzkzzkzzk

j 2 //2是能滿足的最大j』,但是j』+1與i不匹配,所以繼續

i 6

a zzkzzzkzzzkzkkkz

b zzkzzkzzkzzk

j 0

因為j之前已經匹配,所以尋找b[1..j』]和 a[i-j』+1..i]一致,其實就是尋找一段滿足b[1..j』]和 b[j-j』+1..j]一致的自匹配,這個明顯能夠預處理出來,效率為o(n+m)。

主程式如下:

void kmp()

}

預處理f陣列的過程與尋找匹配差不多,**如下:

void work()

}

kmp差不多就是這樣,但是kmp存在有缺陷,一次只能拿乙個字串與文字比較,所以就有了ac自動機。

字串匹配問題 KMP匹配演算法

基本思想 字串匹配問題 在文字串中尋找是否有與模式串相同的子串 在字串匹配時,暴力匹配忽略了如果模式串開頭與中間有重複部分,在將模式串的後面的重複部分匹配後,無法繼續匹配的話,此時將模式串開頭實際上也已經被匹配了,可以直接從開頭重複部分之後開始匹配 這裡引入了乙個部分匹配值表,每個與模式串的字元對應...

字串匹配問題 KMP演算法

字串匹配問題 給定兩個字串s 主串 和t 模式串 假設n strlen s strlen t m,判斷主串s中是否包含模式t,且返回t在s中所在的起始位置。這裡為簡單起見,若s包含t,則只返回第乙個t所在的位置。一般的蠻力法如下 蠻力法在遇到不匹配時,j每次都要回到t的起點,從新開始匹配,這樣來看效...

KMP演算法 字串匹配問題

給定倆個字串str和match,長度分別為n和m。實現乙個演算法,如果字串str中含有字串match,則返回match在str中的開始位置,不含有則返回 1 str acbc match bc 返回2.str acbc match bcc 返回 1.我們知道在match中a區域與b區域是匹配的,所以...