KMP算法详解
这里特别感谢sofu6博主的博客特别完整仔细的讲解了KMP算法
看完这个KMP算法易懂版基本可以理解KMP算法的操作了
新手写的笔记,如有错误,欢迎指正!
- 提到KMP算法,很多人都觉得很困难,困难之处就在next数组部分,下面我来详解一下这部分的运行操作
- next数组就是在主串和模式串不同时,next数组告诉你要跳到哪个位置接着和主串进行比较
- 开始弄KMP算法之前我们要明白一些东西:
- next数组是在模式串里找相同且最大长度的前缀和后缀,但是只在一个串里面找看起来不太方便,我们把他变成两个串,伪主串只提供后缀,伪模式串只提供前缀
2. 当x处的后缀和前缀匹配后,下一个元素也匹配的话,那么 next[x + 1] = next[x] + 1,例如下面举例
- 这里已经 str[k] = str[j] 此时的 next[4] = 1
- j 和 k 同时向后移动一位,发现下一位还是相等的状态
- 这时next[4 + 1] = next[4] + 1 = 5
- 首元素 next[0] = -1 是因为方便后面的计算,当查找到 -1 时说明已经查找到了最左侧,没有和后缀匹配的项 (数据结构书上的最左侧是零,其实是一个道理,他们的字符串默认是从 1 开始索引的,而我们算完是从 0 开始索引的)
- 还需要附上运行的代码,等会需要配合代码一步一步理解
void Getnext(int next[], string t)
{
int j = 0, k = -1;
next[0