Skip to content

Z 函数

Z-function · Z-array

记录从每个位置开始的后缀与整个字符串前缀的最长公共前缀长度。

条目类型
定义

形式陈述

对字符串 s,定义 Z[i]s[i..]s[0..] 的最长公共前缀长度,通常约定 Z[0]=0n。 线性算法维护当前最右的匹配区间 [l,r);若 i<r,先复用 Z[il] 的已知部分,再向右显式扩展。每次字符比较导致右端点推进,故总时间 O(n)

直觉

Z 函数 Z[i] 记录从位置 i 开始的后缀与整个字符串前缀的最长匹配长度。线性算法维护当前最右匹配区间 [l,r):已知区间内文本与前缀相等时,位置 i 可先借用镜像位置的匹配下界,只有越过右边界才需继续比较。每次显式字符比较要么失败,要么推进全局右边界,因此总成本线性。

Z-box、镜像位置与区间复用
例子与边界

字符串 aabcaabxaaaz 的某些位置会有较大 Z 值;更简单地,aaaaa 的 Z 数组(约定 Z[0]=0)为 [0,4,3,2,1]。模式匹配可计算 pattern#text 的 Z 值,凡 Z[i]=|pattern| 的文本位置即为出现点。

Z[0] 有定义为 0n 的不同惯例,代码和公式需统一。分隔符必须不在原字母表中;复用区间时只能取 min(ri,Z[il]),越过右边界的部分仍要实际比较。

推论与应用

序列提供对象。Z 函数在给定串上以确定性最坏 O(n) 时间、O(n) 额外整数空间提取前缀匹配长度;它与前缀函数提供互补的 border 信息并可线性互相转换,也用于周期与前缀出现次数。

pattern#text 上运行 Z 算法仍是一次模式—文本扫描。固定文本上反复查询时,FM-index预处理 BWT 与 rank 结构,以压缩空间提供 count,定位还需额外采样;Z 数组既不保存后缀次序,也不能直接替代 backward search。两者都能找精确出现位置,但预处理对象和查询成本完全不同。

参考资料
  • OI-Wiki contributors, OI-Wiki (2026), Z-function.
  • cp-algorithms contributors, Algorithms for Competitive Programming (2026), Z-function.
  • Dan Gusfield, Algorithms on Strings, Trees, and Sequences, Cambridge University Press, 1997, exact string matching.
关系图谱4 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

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

限定层次等价