KMP字串匹配演算法的分析實現

2021-07-09 22:23:35 字數 870 閱讀 9996

kmp演算法中的next陣列構造是乙個關鍵問題,但是博主發現next陣列的構造方法有很多,不同的演算法實現中構造出的next陣列也有所不同,有些方法實在是晦澀難懂。【經典演算法】——kmp,深入講解next陣列的求解,這篇部落格提供了一種比較簡明的理解和構造next陣列的方法。引入最長部分匹配長度的概念,實質上就是字串的字首(去掉首字元)和字尾(去掉尾字元)相同的最大長度:

(我們稱被匹配的串為源串string source, 作為要匹配物件的串為模式串string pattern)

next[i]實質上就是模式串中從串起始到第i個字元為止的最長部分匹配長度。當我們用next陣列做匹配時如果有nof個字元匹配成功,即patter[nof]匹配失敗時, 檢視next[nof],表示此字元前有next[nof]個字元和模式串起始的next[nof]個字元是匹配的,故只需要把源串當前比較字元繼續與pattern[next[nof]]比較即可。

構造next陣列時,next[0]=0沒有意義,next[0]=0必然,每次根據next[i]計算next[i+1],如果pattern[i]與pattern[next[i]]相等next[i+1]=next[i]+1,否則就像匹配時一樣向前迭代查詢。

void buildnext(string s, int

next)

}

這樣實現的匹配演算法比較簡明, 設定nof使**清晰有條理。外迴圈就表示源串待匹配字元指標的移動。迴圈內部實質上就執行三個操作:1.根據next陣列設定nof。2.判斷當前字元是否匹配(如果匹配nof當然要+1)3.判斷匹配是否結束

//返回第一次匹配成功時在源串中的起始位置

return -1;

}

字串匹配的KMP演算法實現

問題源自資料結構書。問題 字串src中含有模式串pat的個數 舉例 src 00000111111111101010111010101001 pat 110 src中含有多少個pat?分析 沒有回溯的kmp演算法。1 首先實現乙個next數字,其中的值,是匹配失誤之後的下一次匹配的位置。next 0...

用KMP演算法實現字串匹配

如果對於乙個字串a,將a的前面任意一部分挪到後邊去形成的字串稱為a的旋轉詞。比如a 12345 a的旋轉詞有12345,23456,34512,45123和51234。對於兩個字串a和b,請判斷a和b是否互為旋轉詞。給定兩個字串a和b及他們的長度lena,lenb,請返回乙個bool值,代表他們是否...

KMP字串模式匹配演算法實現

kmp演算法是字串模式匹配演算法中較為高效的演算法之一,其在某次子串匹配母串失敗時並未回溯母串的指標而是將子串的指標移動到相應的位置。嚴蔚敏老師的書中詳細描述了kmp演算法,同時前面的例子中也描述了子串移動位置的陣列實現的演算法。前面你已經實現了子串移動的陣列,現在就來利用該陣列來實現kmp模式匹配...