\(\mathcal{KMP算法}\
而\(KMP\的精髓在于,对于每次失配之后,我都不会从头重新开始枚举,而是根据我已经得知的数据,从某个特定的位置开始匹配;而对于模式串的每一位,都有唯一的“特定变化位置”,这个在失配之后的特定变化位置可以帮助我们利用已有的数据不用从头匹配,从而节约时间。
特点:1. \(i\ 不回退 2. \(j\ 回退的位置有讲究 3.构建一个辅助数组( \(nxt\ 数组)来跳过不必要的字符比较,从而提高搜索速度。
\(\mathcal{实现流程}\
找到 \(T'\ 的最长相同前缀与后缀
\(\color{red}{ans:当然是要用到动态规划递推啦。}\
\(\mathcal{构建 Nxt 数组}\
\(\mathcal{实际字符匹配过程}\
我们使用两个指针 \(i\ 和 \(j\ 分别遍历原字符串 \(s\ 和模式串 \(p\ 。如果当前字符匹配,则同时移动 \(i\ 和 \(j\ 。如果字符不匹配,我们根据 \(nxt\ 数组回退 \(j\ 的位置,直到找到匹配的字符或回退到模式串的开头。当 \(j\ 等于模式串长度 \(m\ 时,表示找到了一个匹配,输出匹配位置,并将 \(j\ 重置为 \(0\ 。