1. KMP 的 next 数组如何用"最长真前后缀"避免回溯
KMP 的 next 数组如何用"最长真前后缀"信息避免匹配时的回溯?
- next 数组(prefix function)定义
- 匹配时失配跳转
- O(n+m) 线性
KMP 预处理模式串得到 next[i](= π[i]),表示前缀 s[0..i] 的最长真前后缀长度。匹配时若文本字符与模式字符失配,不是回退文本指针,而是用 next 把模式串"滑动"到最长真前后缀已匹配的位置继续,从而避免重复比较已匹配的字符。文本指针只前进不退,模式指针按 next 跳转,总复杂度 O(n+m)。next 的求法用"自身匹配"(next[i] 由 next[i-1] 递推),也是 O(m)。
next 数组记录了"已匹配后缀的最长真前缀",失配时模式可安全滑到该前缀处,因为前缀已与后缀相同,无需重比。这是 KMP 线性时间的核心。