在看这篇文章之前最好对kmp算法有一定了解。相关的资料网上也有很多的。这篇主要是给还在困惑next数组的小伙伴分享一下我是如何理解的。并不一定对所有人都有用。
Next数组的意义:
用法上的意义,当字符串下一步用next [j] 处的字符继续跟文本串i 处的字符匹配,相当于模式串向右移动 j - next[j] 位。如模式串中在j 处的字符跟文本串在i 处的字符失配时,下一步应该跳到哪个位置。
每个元素的意义,数组当前位置前的,前缀和后缀(最后)的字符相同的个数。
如果各位可以直接理解next数组的原理。可以不用看下面的话。
我理解next数组的方法:
1.看一遍原理的证明(没明白,也没记住)。
2.再看一遍(还是没理解,充分证明了我的愚钝)。
3.看一遍代码(和证明一点也联系不上)。
4.重点:按照代码画一遍。之后再思考一遍KMP算法的意义。
5.重复第1步。
代码:
void GetNext(char* p,int next[])
{
int pLen = strlen(p);
next[0] = -1;
int k = -1;
int j = 0;
while (j < pLen - 1)
{
//p[k]表示前缀,p[j]表示后缀
if (k == -1 || p[j] == p[k])
{
++k;
++j;
next[j] = k;
}
else
{
k = next[k];
}
}
}
练习1:ABCDABDFAB
不知道为什么道出的图片少一部分,缺少的部分是数组p的下标J
后面我就不画了,有兴趣的小伙伴可以补充上。
如果反复验证后有些心的,那么考虑下 "aaaa" 的next数组是什么呢?