600秒速讀 字串匹配 KMP演算法

2021-10-11 07:57:00 字數 2110 閱讀 2234

偽**示例

參考資料

x與 p 中的a不匹配時,已經知道前面五個字元 abaab 是匹配的。而kmp演算法則利用已經比較過的字串,把 pattern 往後繼續滑,跳過已經比較過的位置。

這算是kmp演算法中最核心的部分之一了。個人認為任何不涉及pmt的kmp演算法介紹都是耍流氓。。。

首先,要了解兩個概念:「字首"和"字尾」。 "字首"指除了最後乙個字元以外,乙個字串的全部頭部組合;"字尾"指除了第乙個字元以外,乙個字串的全部尾部組合。(摘自阮一峰大佬)

以剛才的abaaba為例子,看一下字首(prefix),字尾(suffix),最長子串(max-substring),最長子串長度(len-max-substring)

豈不美哉!

有了pmt表,可以往後延伸到所謂的next表。

next 表是由 pmt 表得到的,做到就是將 pmt 表中的每乙個值向後移動 1 位,第一位賦值為 -1。(摘自知乎–小擼伴讀)

在上述pseudo code中,有:

failurefunction 可以用陣列表示,在時間複雜度o(m)內計算;

每次while-loop的迭代中,

因此,在while-loop中,迭代的次數不會超過2n;

綜上,kmp演算法理想狀態下,或者說大部分情況下的時間複雜度是o(m+n)。

用boyermoore演算法的話,

阮一峰的網路日誌

知乎–小擼伴讀

昆士蘭大學comp7505課件

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