kmp个人理解

对于kmp,很多小伙伴就被next数组打败了,今天咱们就来好好聊聊next数组,因为只要next数组搞懂了,匹配串和主串也是一样的道理,只不过求next数组的时候是自己和自己匹配。

对于next数组的前两位都是固定的,第一位和第二位既可以用为0和1,也可以为-1和0,我这边习惯为0和1。

到了后面的时候,就是求匹配串本身的最大前缀和最大后缀的值

比如字符串ababcabcacbab,直接从前三个开始

aba的前缀{a,ab},后缀{a,ba},所以next[3] = 1;

abab的前缀{a,ab,aba},后缀{b,ab,bab},所以next[4] = 2;

ababc的前缀{a,ab,aba,abab},后缀{c,bc,abc,babc},所以next[5] = 1;

ababca的前缀{a,ab,aba,abab,ababc},后缀{a,ca,bca,abca,babca},所以next[6] = 1;

ababcab的前缀{a,ab,aba,abab,ababc,ababca},后缀{b,ab,cab,bcab,abcab,babcab},所以next[7]=2

以此类推,如果匹配的过程中失败的话,就跳到next数组对应的位置上,这就是j = next[j]

相关推荐
w-w0w-w18 小时前
友元函数,友元类,内部类
开发语言·c++
郝学胜-神的一滴19 小时前
OpenGL纹理技术详解:从原理到实践
c++·程序人生·游戏程序·图形渲染·贴图
sin_hielo19 小时前
leetcode 1411(递推)
数据结构·算法·leetcode
兵哥工控19 小时前
mfc一个简单完整调用动态链接库实例
c++·mfc
颜酱19 小时前
学习卡特兰数:从原理到应用,解决所有递推计数问题
前端·javascript·算法
漫随流水19 小时前
leetcode算法(20.有效的括号)
数据结构·算法·leetcode
如果你想拥有什么先让自己配得上拥有20 小时前
数、自然数、整数、有理数、无理数它们的定义由来和边界划分
算法
sayang_shao20 小时前
C++智能指针【笔记】
开发语言·c++·笔记
咸鱼Doyoung20 小时前
《commander-cpp》单头文件的、链式调用的、自动生成帮助文档的C++命令行参数解析库
c++
Xの哲學21 小时前
Linux SLUB 内存分配器深度剖析: 从设计哲学到实战调试
linux·服务器·网络·算法·边缘计算