KMP算法是很早之前学的,当时学完自认为理解的相当清楚清楚了,结果现在就记得怎么这个算法需要一个next数组,至于这个是干啥的,浑然不知。
我今天写的主要目的是复习应试用的,所以直接从正文开始,至于不懂KMP的意思的可以看看别人的博客或问度娘。
首先需要说明的是next数组的作用。next数组与子串是对应的,每一位对应的数字是:当某一位的字符失配后,根据该位所对应next数组中的数值进行移动。
下标 1 2 3 4 5
例 A A A A B 所对应的next数组是【0,0,0,0,4】。则当子串中B失配后,整个子串的移动后,下标为4的字符与失配字符对齐
即 // A A A A A B 原串
// A A A A B 失配子串
// A A A A B 移动后子串
下标 1 2 3 4 5 6
接一下来我直接就上代码了,我讲不清楚原由,但是我会列出我的手工过程,理解整个流程.
获取next数组
void getNextArr(const char*T, int next[]) { 首先先明确这个字符串是从数组1号位开始保存的,即T[0]为字符串长度。所以对应next也从1开始。
next[1] = 0;