文章跳转
👉数据结构-串和数组(一)串的基本概念
👉数据结构-串和数组(二)BF算法
本文详细介绍了KMP的算法思想以及计算next数组的两种算法,分别是手动移位模拟法和前后缀及算法,以及KMP算法优化nextval数组的计算方法。Let’s go!🏃♂️
数据结构-串和数组(三)KMP算法
1、算法思想
由D.E.Knuth,J.H.Morris和V.R.Pratt提出,因此称为 KMP算法;
根据模式串T,求出 next 数组。利用next数组进行匹配(主串指针不回溯)next数组只和短短的模式串有关,和长长的主串无关。
2、复杂度分析
时间复杂度:
KMP算法, 最坏时间复杂度 O(m+n)
其中,求 next 数组时间复杂度 O(m)
模式匹配过程最坏时间复杂度 O(n)
3、 next数组求解
next数组的作用: 当模式串的第 j 个字符失配时,从模式串的第 next[j] 的继续往后匹配
1、手动移位模拟法
next[1] 都⽆脑写 0
next[2] 都⽆脑写 1
其他 next: 在不匹配的位置前,划⼀根美丽的分界线;模式串⼀步⼀步往后退,直到分界线之前“能对上”,或模式串完全跨过分界线为⽌。
此时 j 指向哪⼉, next数组值就是多少;
2、前后缀计算法
next[j] = 字符串的前缀和后缀的最长相等前后缀长度 + 1
4、 KMP算法优化
先得出next数组,然后从头开始遍历
1、先找对应的next[next[j]]
2、判断该字符是否相等
3、相等,则nextval[j] = next[next[j]],即等于找到的next数组值
4、不相等,则nextval[j] = next[j],即等于自身next数组值