kmp 演算法包含兩個部分:
利用 pattern 構建 next 陣列
利用 next 資料去匹配長字串
使用 kmp 演算法的好處是,對於被匹配的長字串,我們始終不需要往回走。
next 陣列中的每乙個元素,比如說 next[i] 代表的是在 pattern 中第 i 個位置之前存在的字首和字尾相等的長度。比如說abcdabce
它的 next 陣列為-1, 0, 0, 0, 0, 1, 2, 3
。next 陣列代表的意義是,匹配失敗時,下一次匹配對齊的位置。
vectorconstruct_next(string pattern);
vectornext(n, 0);
next[0] = -1;
next[1] = 0;
int j = 0, i = 2;
while(i < n)
else if (j > 0)
else
}return next;
}vectorgo(string text, string pattern)
if (text[i] == pattern[j])
else
else}}
return v;
}
KMP演算法原理解析
這種演算法不太容易理解,網上有很多解釋,但讀起來都很費勁。直到讀到jake boxer的文章,我才真正理解這種演算法。下面,我用自己的語言,試圖寫一篇比較好懂的kmp演算法解釋。首先,字串 bbc abcdab abcdabcdabde 的第乙個字元與搜尋詞 abcdabd 的第乙個字元,進行比較。...
kmp演算法的理解與實現
kmp演算法曾被我戲稱為看毛片演算法,當時笑噴.大三那個時候硬著頭皮把演算法導論的kmp演算法啃完,弄懂了kmp演算法 的原理,甚至還寫出了 這幾天再次溫習的時候,發現忘得比較徹底。我總結,學演算法不能只對著書本學理論,而應該 用自己的理解去看清演算法的本質,最好用文字把你的理解記錄下來,這樣才能做...
逐步理解KMP演算法C 完整實現
更進一步,如果模式串有相同的字元呢,很簡單,思路可以不變,只是失配的時候,我們可以把j向前移x步,而不是移到起始位置即可。失配時移動多少步只和模式有關和目標串無關。我們引進乙個陣列,陣列的值儲存的時模式串對應位置字元的部分匹配值,這個陣列的求法如下 首先要介紹一下字串的字首和字尾,字首 指除了最後乙...