KMP模式匹配算法是408统考数据结构部分的高频核心考点,由Knuth、Morris、Pratt三位学者联合提出,核心优势是主串指针全程不回溯,将字符串匹配的时间复杂度从暴力算法的O(n*m)优化至O(n+m),是单模式串匹配的经典高效算法。
🎯 核心思想
暴力匹配算法的痛点是每次失配后,主串指针要回溯到上一轮起始位置的下一个字符,模式串指针重置为0,存在大量重复的无效比较。
KMP算法的核心突破在于:利用模式串自身的前缀-后缀重复信息,提前构建next数组记录每个位置的最长相等前后缀长度。当匹配失配时,主串指针完全不移动,仅通过next数组将模式串指针直接跳转到合理位置,跳过所有已确认匹配的重复字符,彻底避免无效回溯。
📝 408统考标准next数组计算
next数组是KMP算法的灵魂,也是历年408选择题的必考题,408统考采用下标从0开始的标准定义:
- nextj表示模式串P0..j-1子串的最长相等真前缀和真后缀的长度,也就是当模式串第j位与主串失配时,模式串指针应该回退到的下一个比较位置。
以模式串"ababaa"为例,408标准next数组手算步骤:
- 初始化next0 = -1,这是特殊边界标记,表示模式串起始位置就失配时,主串指针直接前进一位
- j从1开始遍历模式串,通过动态规划递推:若Pj == Pk+1,则nextj+1 = k+1;否则递归回溯k = nextk,直到k回到-1边界
- 最终得到该模式串的next数组为:
[-1, 0, 0, 1, 2, 3]


