KMP算法理解之next数组

1

.next数组的求法(这个是真的有点困难的。。。还好自己又搞明白了)

下面以字符串ababaaababaa为例说明一下

next[i](i从1开始算)代表着,除去第i个数,在一个字符串里面从第一个数到第(i-1)字符串前缀与后缀最长重复的个数。

 

Q:何为前缀?

A:以aba为例,它的前缀是ab【一个字符串中从第一个字符到(i-1)个字符,ps: i是字符串长度】

  以zxcvb为例,它的前缀是zxcv,

值得注意的是,前缀必须从最开始数起,最开始。。。

 

Q:何为后缀?

A:同样以aba为例,它的后缀是ba【对于一个字符串而言,长度一定,不论是求前缀还是后缀,二者的长的均为i-1,只不过前缀从开头数,而后缀从结尾倒着数,是倒着数不是倒着写,还是要按照原来的顺序书写,ps: i是字符串长度

  以zxcvb为例,它的后缀是xcvb

————————————————————————————————————————————

在“aba”中,前缀是“ab”,后缀是“ba”,那么两者最长的子串就是“a”;

在“ababa”中,前缀是“abab”,后缀是“baba”,二者最长重复子串是“aba”;

在“abcabcdabc”中,前缀是“abcabcdab”,后缀是“bcabcdabc”,二者最长重复的子串是“abc”;

 

这里重复子串求时还是要注意已下问题:

1.前缀从前往后看,必须从第一个元素开始,后缀是从中间往后看(中间好像不是很严谨,我也不知道怎么表达了),但必须包含最后一个元素

2.中间截一段相同字符串是不行的

 

**********************************************************************************************************************************

ababaaababaa的next数组如下:

 

next[1] = -1,代表着除了第一个元素,前面元素的前缀后缀最长的重复子串,这里是空 ,即"",没有,我们记为-1,代表空。(0代表1位相同,1代表两位相同,依次累加) 注:求第i个元素的前缀和后缀,我们要选取第一位到第(i-1)位的字符串来求。

next[2] = -1,即“a”,没有前缀与后缀,故最长重复的子串是空,值为-1;

next[3] = -1,即“ab”,前缀是“a”,后缀是“b”,最长重复的子串“”;

next[4] = 1,即"aba",前缀是“ab”,后缀是“ba”,最长重复的子串“a”;next数组里面就是最长重复子串字符串的个数

next[5] = 2,即"abab",前缀是“aba”,后缀是“bab”,最长重复的子串“ab”;

next[6] = 3,即"ababa",前缀是“abab”,后缀是“baba”,最长重复的子串“aba”;

next[7] = 1,即"ababaa",前缀是“ababa”,后缀是“babaa”,最长重复的子串“a”;

next[8] = 1,即"ababaaa",前缀是“ababaa”,后缀是“babaaa”,最长重复的子串“a”;

next[9] = 2,即"ababaaab",前缀是“ababaaa”,后缀是“babaaab”,最长重复的子串“ab”;

next[10] = 3,即"ababaaaba",前缀是“ababaaab”,后缀是“babaaaba”,最长重复的子串“aba”;

next[11] = 4,即"ababaaabab",前缀是“ababaaaba”,后缀是“babaaabab”,最长重复的子串“abab”;

next[12] = 5,即"ababaaababa",前缀是“ababaaabab”,后缀是“babaaaababa”,最长重复的子串“ababa”;

 

***********************************************************************************************************************

当然next数组还有另外一种表示方法:

以ABABAAB为例说明:

这里我们定义next[1] = 0 , next[2] = 1;

next[1] = 0 ,事先定义好的

next[2] = 1 ,事先定义好的

next[3] = 1 ,前缀“A”后缀“B”最长重复的子串“”;1代表没有重复,2代表有一个字符重复

next[4] = 2 ,最长重复的子串“a”;追偿的长度加1,即为2.

next[5] = 3 ,以下都跟之前的一样,这种方法是最长的长度再加上一就可以了。

next[6] = 4

next[7] = 2

 

对于上述两种表示方法,实际上是因为原字符串存储时是从0号位置还是1号位置存储的。

从1号位置开始存储时next[1] = 0 ,next[2] = 1 ,事先定义好的,剩余的用前后缀的最长重复子串长度+1代表,1代表没有重复,2代表有一个字符重复,3代表有2个字符重复.。。。。。。

以上存在部分内容参考https://blog.csdn.net/LEE18254290736/article/details/77278769

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值