校招刷题群
高效刷题 迎战校招
校招精选试题
近年面笔经面经群内分享
Java刷题群 前端刷题群 产品运营群
首页 > 数据结构 > KMP
题目

串′ababaaababaa′的next数组为()

A.012345678999

B.012121111212

C.011234223456

D.0123012322345

解答

正确答案是 C


next数组的求解方法是:第一位的next值为0,第二位的next值为1,后面求解每一位的next值时,根据前一位进行比较。首先将前一位与其next值对应的内容进行比较,如果相等,则该位的next值就是前一位的next值加上1;如果不等,向前继续寻找next值对应的内容来与前一位进行比较,直到找到某个位上内容的next值对应的内容与前一位相等为止,则这个位对应的值加上1即为需求的next值;如果找到第一位都没有找到与前一位相等的内容,那么需求的位上的next值即为1。  

C 5条回复 评论
阿阑

太好了,明了易懂,感谢

发表于 2021-09-12 10:00:00
0 0
小小精灵

按照kmp思路,最大长度表为001231123456则对应的next数组为-100123112345,由答案可知,此题中是从下标1开始,所以可推倒答案为
011234223456

发表于 2018-10-13 14:33:26
0 0
花花

next数组下标从1开始计算

next[1] 肯定是 0 
next[2] 肯定是 1
next[n] 的情况,将前面n-1个字符,计算从首尾开始组成最大的相同子串的长度,如果找到,那么next值是该长度加1,否则next值是1。

举例
next[6]的计算,字符串第六位是 a ,( ababa a ababaa)
将前面的5个字符,从头尾开始取4个组成子串比较,如果不相等,则从首尾取3个字符组成子串继续比较,并以此类推,如果一直比较到最后一个字符都不相等,那么该next值为1。
4个字符的情况:abab : baba

3个字符的情况:aba   :  aba  此时相等,那么next[6] = 3+1 = 4

发表于 2018-10-13 14:33:13
0 0
柠檬很甜

 next数组下标从1开始计算

next[1] 肯定是 0 
next[2] 肯定是 1
next[n] 的情况,将前面n-1个字符,计算从首尾开始组成最大的相同子串的长度,如果找到,那么next值是该长度加1,否则next值是1。

举例
next[6]的计算,字符串第六位是 a ,( ababa a ababaa)
将前面的5个字符,从头尾开始取4个组成子串比较,如果不相等,则从首尾取3个字符组成子串继续比较,并以此类推, 如果一直比较到最后一个字符都不相等,那么该next值为1。
4个字符的情况:abab : baba

  3个字符的情况:aba   :  aba  此时相等,那么next[6] = 3+1 = 4

发表于 2018-10-13 14:32:51
0 0
改造家

答案也是借鉴大神的!只是拿来和大家分享!!! 

     i       0    1    2    3    4    5   6   7    8   9   10  11
     s     a    b    a    b    a    a   a   b    a    b   a    a  
next[i]   -1   0    0   1     2    3   1   1    2    3   4    5
先计算前缀next[i]的值: (字符串匹配是 从头开始的 和 从尾开始的字符串进行匹配是否重复
next[i]的值主要是看s[i]之前的字符串中重复的子串长度。next[0] = -1,定值。  
next[1]是看s[1]之前的字符串“a”中重复的子串长度为0,故next[1] = 0。
next[2]是看s[2]之前的字符串“ab”中重复的子串长度为0,故next[2] = 0。
next[3]是看s[3]之前的字符串"aba"中重复的子串长度,s[0]与s[2]重复,长度为1,故next[3] = 1。
next[4]是看s[4]之前的字符串"abab"中重复的子串长度,s[01]与s[23]重复,长度为2,故next[4] = 2。
next[5]是看s[5]之前的字符串"ababa"中重复的子串长度,s[012]与s[234]重复,长度为3,故next[5] = 3。
next[6]是看s[6]之前的字符串"ababaa"中重复的子串长度,s[0]与s[5]重复(因为多了一个a,无法找到长度为3的重复字符串,这只能是s[0]和s[5]重复),长度为1,故next[6] = 1。

同样的,求next[7]和next[8]、next[9]、 next[10]、 next[11] 分别为1和2、3、4、5。

发表于 2018-10-13 14:32:38
0 0