“把精确匹配中的长度 $m$ 模式推广为字符类序列 $C 0,\ldots,C {m 1}$,其中每个 $C i\subseteq\Sigma$,$\Sigma$ 是有限字母表。文本为 $T[…”
形式陈述
精确字符串匹配给定两个有限词:文本
本文约定空模式出现在全部
直觉
字符串匹配寻找模式在文本中的所有起始位置。朴素方法在每个位置重新比较,但一次失配并不抹掉此前得到的信息;高效算法会复用“已经知道哪些前后缀相等”,由模式自身的重复结构判断可以安全右移多少,或借助哈希、自动机状态避免重复工作。算法选择取决于单模式或多模式、离线或在线、字母表大小,以及是否允许概率碰撞或近似误差。
例子与边界
模式 ababaca 的前缀函数记录每个前缀可与自身后缀重合的最长长度,KMP 失配时沿这些 border 回退。Rabin–Karp 用滚动哈希筛选候选位置,若不再逐字符验证,会有碰撞概率。精确匹配不同于允许编辑距离的近似匹配,也不同于正则表达式匹配。空模式按本页约定另行报告全部边界。
文本 abababa 中模式 aba 出现在位置
空模式、Unicode code point 与字节、大小写归一化都会影响“字符”和位置定义。精确匹配不允许插入删除替换;编辑距离网格则比较两个整串的最小改写费用。若只允许插删且差异较少,Myers 最短脚本算法按编辑次数扩展对角前沿。通配符或正则表达式搜索又需要另行定义允许的模式。
若每个模式位置允许一个明确的字符集合,Shift-And 字符类匹配用掩码同时保留所有匹配前缀,支持单符号通配、补类与重叠端点。跨多个字时须传递移位进位并按实际字数计费;把字符类“有交集”直接替换进KMP的字面相等判断,会错误地保留不成立的后缀。
推论与应用
单模式精确匹配中,KMP 算法用前缀函数在失配时复用已知边界,给出确定性线性最坏时间;Rabin–Karp 算法用滚动哈希筛选窗口,必须把碰撞验证和概率假设写入保证;Aho–Corasick 自动机把模式 Trie 与失败边合并:给它只含
词提供离散符号序列,数组提供索引表示。KMP、Rabin–Karp 与 Z 函数面向一次或少量模式扫描;Aho–Corasick 预处理模式集合后在线读取文本。以上复杂度通常按文本、模式和实际报告数计,不包含建立固定文本全文索引的成本。
编辑器的“查找全部”需要明确是否保留重叠位置,生物序列检索还要明确字母表与是否允许突变,日志扫描常同时匹配一组告警词,编译器词法分析则按多个 token 模式决定最长合法前缀。它们共享模式匹配内核,却因重叠、近似、多模式与优先级规则不同而需要不同接口,不能只报一个扫描复杂度便视为同一任务。
固定文本上的大量查询可转向后缀树,以线性级结构换取沿模式字符导航;Burrows–Wheeler 变换重排文本以暴露可压缩上下文,FM-index再叠加 rank 与采样,分别提供 count、locate 和 extract。后两者构成压缩自索引路线,不是把单次 KMP 的
参考资料
- Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,Ch. 32 “String Matching”。
- Dan Gusfield, Algorithms on Strings, Trees, and Sequences, Cambridge University Press, 1997,Chs. 1–2, borders, prefix matching, and linear algorithms。