kmp算法对应next数组中核心while部分的剖析
来源:互联网 发布:linux翻译软件 编辑:程序博客网 时间:2024/06/01 09:03
在写此文之前,我看了很多关于kmp算法的资料,此文主要是针对对应kmp算法已经稍微知道,但是却看不懂求解next数组部分的while部分。
while部分是整个求解next数组的核心。相信看过kmp算法资料的人都知道,所谓的next数组,是待匹配的字符串的最大相同前后缀。
例如 主字符串“adhajdnjkabefaehdfbieadbkaeudio” 待匹配的字符串“adb”,就是从主串中去寻找是否存在待匹配的字符串。
对于一般情况,求解字符串的next数组,很容易理解,关键在于
while (index >= 0 && pattern[i] != pattern[index + 1])//pattern是待匹配的数组 ,index是对应位置的最大相同前后缀。
{
index = next[index];
}
我相信肯定有部分人对这个while里面的内容百思不得其解。
这里 我的next数组的初始值为0,有些资料上是-1.
如果字符串的某位的next值不为0(假设为n),说明此位(假设为y)与前面的第n位相同,并且从y-n到y,和从0到n都分别对应相同。
但是到了第y+1位时,忽然和第n+1位不一样了,问题就来了,我一开始以为,既然不一样了,那么y+1位的next值就是0咯。
其实不一定,因为在前n位仍然存在小于n位的字符串可能与第y+1位以及y+1位前几位正好对应匹配。
那我们假设,存在这种情况,如下图
倒数第二位的c和第7位的c相同。next值为7.可是倒数第1位的t和第8位的a不匹配。但是我们发现,它和第4位的t相同。并且,前面三位也正好匹配。
这确实是一种巧合,但是我们不能忽略这种巧合,关键在于怎么求。
我们知道,倒数第二位的c和第7位的c相同,那么如果第7位的c也有匹配值(不为0),例如图上就是第三位的c,也就是说,倒数第二位的c和第三位的c一样。
这个时候我们再判断第三位和倒数第二位分别延后一位的字符是否一样。图上是一样的,所以最后一位t匹配值为4.
当然,如果不一样,我们就继续while循环,第三位的c是否有匹配值(也就是倒数第二位的c是否还有更小的匹配值),如果有,那么重复上述。
也就是while的作用。直到前面都没了匹配值,也就是为0了。
- kmp算法对应next数组中核心while部分的剖析
- KMP算法中next数组的计算方法
- KMP算法中next数组的求取
- KMP算法和KMP算法中next数组的讲解
- KMP算法的next数组
- KMP算法中next数组、nextval数组的手工计算
- KMP算法中next和nextval数组的计算方法
- 详解KMP算法中Next数组的求法
- POJ 2752 KMP算法中next数组的应用
- <转>KMP算法中关于next数组的探究
- HDU 3336 KMP算法中对next数组的理解
- 【模版】KMP算法中next数组的求法。
- KMP算法中next和nextval数组的求解
- KMP算法中next数组的手工计算方法
- 详解KMP算法中Next数组的求法
- KMP算法中关于next数组的探究
- kmp算法中next数组的3种表示方式
- KMP算法中特征值数组next的计算与使用
- 技术宅找女朋友的技术分析
- C语言 笔记
- Matlab2014b无法调用USB摄像头
- swift 常量使用注意事项
- Cordova Ajax请求跨域问题整理
- kmp算法对应next数组中核心while部分的剖析
- php实现文件上传到指定文件夹,文件路径或名字存入数据库,如何实现啊
- 两种自定义安全键盘&屏蔽系统输入法
- 关于ReentrantReadWriteLock小实例
- 安装Ubuntu系统
- 谷歌学术辅助科研
- Unity学习日记(十三) xml文件简单的操作(一)
- 一个封装好的SurfaceView+MediaPlayer开源视频播放器
- 二分查找算法 python