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