Skip to content

字符串匹配

String matching · Exact pattern matching

在文本中定位模式串全部出现位置的问题。

条目类型
模型

形式陈述

精确字符串匹配给定文本 T[0..n1] 和模式 P[0..m1],寻找所有位移 s,使

T[s..s+m1]=P[0..m1].

朴素算法逐位移比较,最坏 O((nm+1)m)。KMP 预处理模式的最长真前缀—后缀信息,使失配后复用已知匹配而不回退文本指针,预处理 O(m)、扫描 O(n)。有限自动机、Z 算法和 Rabin–Karp 也提供不同时间/空间或随机化权衡。

直觉

字符串匹配寻找模式在文本中的所有起始位置。朴素方法在每个位置重新比较,但一次失配并不抹掉此前得到的信息;高效算法会复用“已经知道哪些前后缀相等”,由模式自身的重复结构判断可以安全右移多少,或借助哈希、自动机状态避免重复工作。算法选择取决于单模式或多模式、离线或在线、字母表大小,以及是否允许概率碰撞或近似误差。

文本窗口与模式对齐
例子与边界

模式 ababaca 的前缀函数记录每个前缀可与自身后缀重合的最长长度,KMP 失配时沿这些 border 回退。Rabin–Karp 用滚动哈希筛选候选位置,若不再逐字符验证,会有碰撞概率。精确匹配不同于允许编辑距离的近似匹配,也不同于正则表达式匹配。空模式出现位置的约定应由接口明确。

文本 abababa 中模式 aba 出现在位置 0,2,4,重叠匹配必须保留。朴素算法最坏 O(nm);KMP 用前缀函数达到 O(n+m),Rabin–Karp 用滚动哈希筛选候选。

空模式、Unicode code point 与字节、大小写归一化都会影响“字符”和位置定义。精确匹配不允许插入删除替换;带编辑距离、通配符或正则表达式的搜索属于更广模型。

推论与应用

单模式精确匹配中,KMP 算法用前缀函数在失配时复用已知边界,给出确定性线性最坏时间;Rabin–Karp 算法用滚动哈希筛选窗口,必须把碰撞验证和概率假设写入保证;多模式场景由Aho–Corasick 自动机把模式 Trie 与失败边合并,扫描时间还要计入输出总数。模式数、是否允许随机碰撞和是否报告全部位置决定应采用哪条路线。

提供离散符号序列,数组提供索引表示。KMP、Rabin–Karp 与 Z 函数面向一次或少量模式扫描;Aho–Corasick 预处理模式集合后在线读取文本。以上复杂度通常按文本、模式和实际报告数计,不包含建立固定文本全文索引的成本。

编辑器的“查找全部”需要保留重叠位置,生物序列检索还要明确字母表与是否允许突变,日志扫描常同时匹配一组告警词,编译器词法分析则按多个 token 模式决定最长合法前缀。它们共享模式匹配内核,却因重叠、近似、多模式与优先级规则不同而需要不同接口,不能只报一个扫描复杂度便视为同一任务。

固定文本上的大量查询可转向后缀树,以线性级结构换取沿模式字符导航;Burrows–Wheeler 变换重排文本以暴露可压缩上下文,FM-index再叠加 rank 与采样,分别提供 countlocateextract。后两者构成压缩自索引路线,不是把单次 KMP 的 O(n+m) 简单改写成更小空间。

参考资料
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,Ch. 32, exact string matching and KMP。
  • Dan Gusfield, Algorithms on Strings, Trees, and Sequences, Cambridge University Press, 1997,Chs. 1–2, borders, prefix matching, and linear algorithms。
关系图谱11 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系