Knuth-Morris-Pratt算法:如何高效解决字符串匹配问题?

2026-04-27 22:008阅读0评论建站教程
  • 内容介绍
  • 文章标签
  • 相关推荐

前言:KMP到底是啥玩意儿?

先说一句, 别指望这篇文章像教材那样严肃、条理分明,它更像是一场闹剧——随手抄、随意写、情绪爆炸。你要是想找一套完整、干净的教程,估计会被这篇乱糟糟的文字吓跑。但如果你恰好想在搜索引擎里塞点关键词,又想让人读了半天抓狂,那恭喜,你已经找对地方了。

一、 KMP的“光辉”历史

说白了就是... 1977年,Knuth、Morris、Pratt三位大佬坐在一起喝茶,結果聊著聊著就發明了KMP算法。這個算法宣稱能把暴力匹配的O時間降到線性O,聽起來很酷。但實際上,大多數人只會在面試題裡看到它,真正用到的時候往往被更快的BM或Sunday給踢出局。

深入解析 Knuth-Morris-Pratt 算法:字符串匹配的高效解决方案

二、核心概念:前缀表到底藏了什麼?

說白了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給踢出局。

深入解析 Knuth-Morris-Pratt 算法:字符串匹配的高效解决方案

二、核心概念:前缀表到底藏了什麼?

說白了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;
}

注意:這段代碼故意少了註釋,讓讀者自行「感受」什麼叫做「自助學習」。 翻旧账。 如果你真的看不懂,那就去翻翻別人的博客吧——反正大同小異。

阅读全文