演算法圖鑑
String Algorithms · 比較表

字串比對演算法比較

字串雜湊、Rabin-Karp、KMP、Z 演算法、Manacher、字典樹:預處理誰、保證什麼、各自擅長的問題形狀。

演算法時間空間預處理保證問題形狀難度
String Hashing字串雜湊O(n)O(n)文字(前綴雜湊)機率正確任意子字串 O(1) 比較進階
Rabin-Karp滾動雜湊比對平均 O(n+m)O(1)模式(一個雜湊值)平均 O(n+m)多個模式同時找進階
KMP前綴函數比對O(n+m)O(m)模式(失敗函數)最壞 O(n+m)單一模式、串流文字困難
Z-AlgorithmZ 函數O(n+m)O(n)模式 + 文字(串接)最壞 O(n+m)每個位置的最長前綴匹配困難
Manacher最長回文O(n)O(n)文字(插入分隔符)O(n)回文困難
Trie Applications字典樹應用O(L)O(ΣL)字典(所有模式)O(L) 每次查詢前綴查詢、字典比對進階

什麼時候選哪一個

選擇指南

  • 一個模式、一段文字 → KMP。要簡單一點可以用內建 findstrstr,它們通常也是線性的。
  • 很多模式 → 等長用 Rabin-Karp 的雜湊集合;不等長且要一次全找出來,是 Aho-Corasick(字典樹 + KMP 的合體,本站未收錄)。
  • 子字串相等、重複、比較 → 字串雜湊。它是唯一能 O(1) 比較任意兩段的方法,代價是機率正確。
  • 回文 → Manacher。中心擴展 O(n²) 在 n ≤ 1000 也夠用,先寫得對再換。
  • 前綴 → 字典樹。後綴或任意子字串的結構問題 → 後綴陣列/後綴自動機(本站未收錄)。