首先,kmp演算法是解決字串匹配問題的演算法,即在主串 s 中查詢子串 t。
我們從問題入手,要在主串中查詢子串,顯然可以是用蠻力法逐個遍歷,即從主串的第乙個字元開始和子串的第乙個字元比較,若相等則繼續比較後續字元,若果不相等,則從主串的下乙個的字元、子串的第乙個字元重新開始比較。如果在主串遍歷完之後還沒有找到對應子串,則匹配失敗。
暴力法演算法描述如下:
public static int findsubstring(string s,string t)
if (i == len)
}if (len < 1) next[j] = 0;
}}
我們重點來看一下最內層迴圈實現的效果。if 語句裡面比較的內容是:i 和 (j-len)+i 的位置的數值。當只有 i 變化時,if 語句比較的是 i 和與它固定間距(j-len)位置的值。舉個例子,如果這個子串有 4 個字元,第一次進行最裡面迴圈的時候,這個固定間距是 1(len 的初始值是 j-1),換句話說,他想試驗是否存在長度為 3 的最長重複部分。當 len-1 後,這個固定間距變成了 2,對於長度為 4 的字串來說,就是想找到是否存在長度為 2 的最大重複部分。這樣一來,就實現了前面所說的 尋找最大重複部分的功能。
在第二層迴圈裡面 判斷 i==len 是為了斷定是否存在 len 長度的子串。
最後,我們將這個函式呼叫起來:
static int kmp(string s,string t){
int i = 0;
int j = 0;
int next = new int[100];
getnext(t,next);
while (i這裡求next陣列的方法用的是暴力法。但是子串的長度一般不是太長,時間消耗不多。過幾天更新更好的方法。
如有錯誤,請指正,謝謝。
看毛片(KMP)演算法簡析
看毛片演算法又稱kmp演算法。該演算法之所以得名無外乎如下原因。每當涉及該演算法都甚新鮮,極想把玩一番,經過一番琢磨,終於悟透其本質。遂將其束之高閣,數月之後,再相邂逅,新鮮如初,又是一番把玩 醒悟 遺忘,如此迴圈以至無窮。足見,該演算法與看毛片的道理一脈相承。初看新鮮刺激,觀摩研究,醒悟不過如此而...
KMP演算法小析
對於串的模式匹配演算法,相信學data structure的都不會很陌生,不過當我們看到各種書上對演算法kmp的講解時,我們會有種不知所云的感覺就算有的c 的演算法實現,和例子的講解,當換成另外乙個串時,我們將無從下手,其中對next的求解,更讓我們痛苦。在這裡sinpoal將自己對這個演算法的看法...
Kmp演算法初析
考慮字串匹配問題。假設文字是乙個長度為n nn的字串t tt,模板是乙個長度為m mm的字串p pp,且m n m nm n。尋找匹配點使得t i p 0 t i m 1 1 p m 1 t i p 0 t i m 1 1 p m 1 t i p 0 t i m 1 1 p m 1 樸素方法 列舉起...