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

已知串S= ‘babab ' , 其 Next 数值序列为

A.01112

B.01233

C.01123

D.01223

解答

正确答案是 C


首先介绍2个概念,字符串的前缀和后缀(这里的前缀是不包括最后一个字符的子串,后缀是不包含第一个字符的子串)。
拿题目中的字符串a=''babab''举例,
首先第一位0,第二位1。这个是固定的。
第三位,字符串是“bab”,这时候“bab”的前缀有b,ba;后缀有ab,b,可以看出前后缀相等的最长的字符串只有b,因为b的长度是1,所以这里第三位的next值就是1。
到了第四位,字符串是“baba”,前缀是b,ba,bab;后缀是aba,ba,a。这里可以看出前后缀相等的最长的字符串是ba,长度是2,因此第四位的next值是2。
到了第五位,字符串是“babab”,前缀是b,ba,bab,baba;后缀是abab,bab,ab,b。这里可以看出前后缀相等的最长的字符串是bab,长度是3,因此第五位的next值是3.
因此综合起来next值就是0 1 1 2 3,也就是答案C。
C 6条回复 评论
指缝间的阳光

我想学习黑客,但是我没有文化

发表于 2022-08-17 23:00:00
0 0
coderpwh

收藏不息,战斗不止

发表于 2022-02-17 22:00:00
0 0
改造家

求next找前后串相同的子串的最大长度,第一位个第二位是0 1

发表于 2018-10-13 11:13:12
0 0
粽子


首先看看next数组值的求解方法例如: 
模式串 a b a a b c a c 
next值 0 1 1 2 2 3 1 2 
       
       next数组的求解方法是:第一位的next值为0,第二位的next值为1,后面求解每一位的next值时,根据前一位进行比较。首先将前一位与其next值对应的内容进行比较,如果相等,则该位的next值就是前一位的next值加上1;如果不等,向前继续寻找next值对应的内容来与前一位进行比较,直到找到某个位上内容的next值对应的内容与前一位相等为止,则这个位对应的值加上1即为需求的next值;如果找到第一位都没有找到与前一位相等的内容,那么需求的位上的next值即为1。
       看起来很令人费解,利用上面的例子具体运算一遍。
       1.前两位必定为0和1。
       2.计算第三位的时候,看第二位b的next值,为1,则把b和1对应的a进行比较,不同,则第三位a的next的值为1,因为一直比到最前一位,都没有发生比较相同的现象。
       3.计算第四位的时候,看第三位a的next值,为1,则把a和1对应的a进行比较,相同,则第四位a的next的值为第三位a的next值加上1。为2。因为是在第三位实现了其next值对应的值与第三位的值相同。
       4.计算第五位的时候,看第四位a的next值,为2,则把a和2对应的b进行比较,不同,则再将b对应的next值1对应的a与第四位的a进行比较,相同,则第五位的next值为第二位b的next值加上1,为2。因为是在第二位实现了其next值对应的值与第四位的值相同。
       5.计算第六位的时候,看第五位b的next值,为2,则把b和2对应的b进行比较,相同,则第六位c的next值为第五位b的next值加上1,为3,因为是在第五位实现了其next值对应的值与第五位相同。
       6.计算第七位的时候,看第六位c的next值,为3,则把c和3对应的a进行比较,不同,则再把第3位a的next值1对应的a与第六位c比较,仍然不同,则第七位的next值为1。
       7.计算第八位的时候,看第七位a的next值,为1,则把a和1对应的a进行比较,相同,则第八位c的next值为第七位a的next值加上1,为2,因为是在第七位和实现了其next值对应的值与第七位相同。

发表于 2018-10-13 11:13:03
0 0
几米的思维

以下是个人理解:


比如上面那个:
(P)模式串 a b a a b c a c   
坐标:           1 2 3 4 5 6 7 8
next值            0 1 1 2 2 3 1 2   
坐标为1的a和坐标为2的b初始值就为0和1.
计算坐标为3的a的next值 ([]中的数字为坐标) :P[2] = b, next[2] = 1; P[next[2]] = P[1] = a;P[2] != P[1],所以next[3] = 1(好像是这么规定的?)
计算坐标为4的a的next值:P[3] = a, next[3] = 1; P[next[3]] = P[1] = a, next[next[3]] = next[1] = 1; P[3] = P[1],取匹配前的那个字母的前next的值(这个是坐标为3的a)+1得:next[4] =  next[next[3]] + 1 = next[1] +1 = 2;
计算坐标为5的b的next值:P[4] = a, next[4] = 2; P[next[4]] = P[2] = b, next[next[4]] = next[2] = 1; P[  next[ next[4] ]  ] = P[1] = a, next[   next[ next[4] ]  ] = 0。 取匹配前的那个字母的前next的值(这个是坐标为2的b)+1得:next[5] =  next[next[4]] + 1 = 2;
计算坐标为6的c的next值:P[5] = b, next[5] = 2; P[ next[5] ] = P[2] = b, next[ next[5] ] = 1;  取匹配前的那个字母的前next的值(这个是坐标为5的b)+1得:next[6] = 2 + 1 = 3;

...................

发表于 2018-10-13 11:12:27
0 0
咸鱼王

Next数值序列需要计算字符串前缀和后缀最长匹配相同的长度加一而得。

第1位一定是0
看S第一位“b” ,没有前缀和后缀 所以一般第2位一定是1(0+1);
看S.substring(0,2)“ba” 前缀b后缀a,相等长度为0,第3位是1(0+1);
看S.substring(0,3)“bab” 前缀b=后缀b,相等长度为1,第4位是2(1+1);
看S.substring(0,4)“baba” 前缀ba=后缀ba,相等长度为2,第5位是3(2+1);

则S的Next数值序列为 01123

发表于 2018-10-13 11:12:06
0 0