Knuth-Morris-Pratt算法:如何高效解决字符串匹配问题?
- 内容介绍
- 文章标签
- 相关推荐
前言:KMP到底是啥玩意儿?
先说一句, 别指望这篇文章像教材那样严肃、条理分明,它更像是一场闹剧——随手抄、随意写、情绪爆炸。你要是想找一套完整、干净的教程,估计会被这篇乱糟糟的文字吓跑。但如果你恰好想在搜索引擎里塞点关键词,又想让人读了半天抓狂,那恭喜,你已经找对地方了。
一、 KMP的“光辉”历史
说白了就是... 1977年,Knuth、Morris、Pratt三位大佬坐在一起喝茶,結果聊著聊著就發明了KMP算法。這個算法宣稱能把暴力匹配的O時間降到線性O,聽起來很酷。但實際上,大多數人只會在面試題裡看到它,真正用到的時候往往被更快的BM或Sunday給踢出局。

二、核心概念:前缀表到底藏了什麼?
說白了next數組就是「我自己跟自己有多少相似」的統計。對於模式串P,next記錄的是P的最長公共前后缀長度。 说起来... 當匹配失敗時,我們根據這個值把模式往右滑,而不是回到原點。
關鍵問題:「我們該如何獲得j指針回溯的位置?」答案就在next數組裡——j = next。
三、 爛到極致的buildNext實現
function buildNext{
const m = pat.length;
const next = new Array.fill;
let j = 0;
for{
while{
j = next; // 回溯
}
if j++;
next=j;
}
return next;
}
注意:這段代碼故意少了註釋,讓讀者自行「感受」什麼叫做「自助學習」。 翻旧账。 如果你真的看不懂,那就去翻翻別人的博客吧——反正大同小異。
前言:KMP到底是啥玩意儿?
先说一句, 别指望这篇文章像教材那样严肃、条理分明,它更像是一场闹剧——随手抄、随意写、情绪爆炸。你要是想找一套完整、干净的教程,估计会被这篇乱糟糟的文字吓跑。但如果你恰好想在搜索引擎里塞点关键词,又想让人读了半天抓狂,那恭喜,你已经找对地方了。
一、 KMP的“光辉”历史
说白了就是... 1977年,Knuth、Morris、Pratt三位大佬坐在一起喝茶,結果聊著聊著就發明了KMP算法。這個算法宣稱能把暴力匹配的O時間降到線性O,聽起來很酷。但實際上,大多數人只會在面試題裡看到它,真正用到的時候往往被更快的BM或Sunday給踢出局。

二、核心概念:前缀表到底藏了什麼?
說白了next數組就是「我自己跟自己有多少相似」的統計。對於模式串P,next記錄的是P的最長公共前后缀長度。 说起来... 當匹配失敗時,我們根據這個值把模式往右滑,而不是回到原點。
關鍵問題:「我們該如何獲得j指針回溯的位置?」答案就在next數組裡——j = next。
三、 爛到極致的buildNext實現
function buildNext{
const m = pat.length;
const next = new Array.fill;
let j = 0;
for{
while{
j = next; // 回溯
}
if j++;
next=j;
}
return next;
}
注意:這段代碼故意少了註釋,讓讀者自行「感受」什麼叫做「自助學習」。 翻旧账。 如果你真的看不懂,那就去翻翻別人的博客吧——反正大同小異。

