数据结构与算法——串与kmp算法
数据结构与算法——串与kmp算法
KMP算法
首先要明确kmp算法中next数组的作用:记录的是模式串下一次应该与主串进行匹配的下标,不是模式串应该移动的距离。
在描述kmp算法时为了形象,将提高算法效率的方法说成:不让主串的指针回溯,将模式串“ 滑动 ” 尽可能的距离后,继续进行比较。这里的滑动是加了引号的滑动,实际是指针指向数组下标的更换。
next【j】(注意到了吗,next数组中填放的是模式串的指针,next【 j 】存放的是下一次要与主串比较下标元素,下标就是next【 j 】这次要求的内容,(等于说上一次求了,下一次就用)next【】数组的求法要以 j 指针的数值为铺垫)数组的求法:
求法:
next【 j 】= 0 , 当 j == 1 时,也就是指向模式串中的第一个元素
next【 j 】= L(max)+ 1,L(max)是匹配过的子串中最大相等前后缀的长度
next【 j 】= 1 , 当匹配过的字串没有最大相等前后缀时
就像这一题:
模式串的指针我们默认为 j 。
1、j 指向 a ,a是模式串中的第一个元素,所以为 0
2、j 指向 b ,前面只有 a ,没有最大相等前后缀,所以为 1
3、j 指向 a ,前面匹配过的子串是 ab , 没有最大相等前后缀 ,所以next数组中的数为 1
4、j 指向 b ,前面匹配过的子串是 aba , 最大相等前后缀为 1 ,所以next数组中的数为 2
5、j 指向 a ,前面匹配过的子串是 abab ,最大相等前后缀为 2 ,所以next数组中的数为 3
6、j 指向 b ,前面匹配过的子串是ababa ,最大相等前后缀为 3 ,所以next数组中的数为 4
7、j 指向 a ,前面匹配过的子串是ababab , 最大相等前后缀为 4 ,所以next数组中的数为 5
8、j 指向 a ,前面匹配过的子串是abababa ,最大相等前后缀为 5 ,所以next数组中的数为 6
9、j 指向 b ,前面匹配过的子串是abababaa , 最大相等前后缀为 1 ,所以next数组中的数为 2
所以next【 j 】数组为 0 1 1 2 3 4 5 6 2
到此依靠人脑next数组中数值的判断已经没问题了
接下来就是让计算机知道怎么求解next数组中的值了
也就是编程求得next数组的函数值(也是最难的 呜呜呜呜)
(2条消息) Round10—串_你倒是敲代码鸭.-CSDN博客
先插入一个有些新意和代表性的kmp算法编程题
pta错题集#
kmp算法中要知道next【i】取值的依据然后才能进行模式匹配
next【i】数组的求解
8+7+6+5+4+3+2+1+1(空串)
= 37
作者:Evinci
出处:https://www.cnblogs.com/evinci/p/17124006.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律