【笔记】KMP算法相关计算题(选择题)

例1:串“ababaaababaa”的next数组:
答:
作出模式串一集对应字符下标(此处从-1开始):

a b a b a a a b a b a a
0 1 2 3 4 5 6 7 8 9 10 11

S的串长度为0时,next [0] = -1;
S的串长度为1时,next [1] = 0;
S的串长度为2时,S串为“ab”,next[2] = 0;
S的串长度为3时,S串为“aba”,next[3] = 1;
S的串长度为4时,S串为“abab”,next[4] = 2;
S的串长度为5时,S串为“ababa”,next[5] = 3;
S的串长度为6时,S串为“ababaa”,next[6] = 1;
S的串长度为7时,S串为“ababaaa”,next[7] = 1;
S的串长度为8时,S串为“ababaaab”,next[8] = 2;
S的串长度为9时,S串为“ababaaaba”,next[9] = 3;
S的串长度为10时,S串为“ababaaabab”,next[10] = 4;
S的串长度为11时,S串为“ababaaababa”,next[11] = 5;

例2:
已知字符串S为”abaabaabacacaabaabcc”,模式串t为”abaabc”。采用KMP算法进行匹配,第一次出现“失配”(s[i]!=t[j])时,i=j=5,则下次开始匹配时,i和j的值分别是:i=5 j=2

由题中“失配s[i]!=t[j]时,i=j=5”,可知题中的主串和模式串的位序都是从0开始的。按照next数组生成算法,对于t有:
编号:0 1 2 3 4 5
t :a b a a b c
next :-1 0 0 1 1 2

依据kmp算法“当失配时,i不变,j回退到next[j]的位置并重新比较”,当失配s[i]!=t[j]时,i=j=5,next[j]=next[5]=2(位序从0开始)。从而最后结果应为:i=5 j=2

思考:什么时候next由-1、0、。。。什么时候由0、1、。。。
计算j值的时候又由哪个next确定?

个人看法(并不知道是否正确):
由-1和由0开始不同在于:
next[]表示回退到的字符的位置,例:若回到第三个字母a,则不同的位序字母a的位置不同,由0开始的位序,则a对应的位置为2,由1开始的位序,则a对应的位置为3。
而-1开头则对应位序从0开始;
0开头则对应位序从1开始。

而例2中,c位于第六个字母,而此时j=5,故可知位序从0开始。

PS:以上为个人理解,如果理解有偏差请不要骂我,请在评论中指出,我会认真学习并更改笔记的!笔芯!

你可能感兴趣的:(笔记,数据结构)