利用KMP算法,求模式串的abcdabcdab的next函数值和nextval函数值
时间: 2024-05-25 09:09:53 浏览: 86
首先,KMP算法的next函数用于记录模式串中每个位置之前的子串中,最长的既是前缀又是后缀的长度。而nextval函数是在next函数的基础上,对于next[j]等于k的情况,如果模式串中的P[k]等于P[j],则nextval[j]等于nextval[k],否则nextval[j]等于k。
现在我们来求模式串abcdabcdab的next函数值和nextval函数值:
1. 计算next函数值:
首先,第一个字符是a,它之前没有子串,所以next[0]=-1。
接下来,我们从第二个字符b开始考虑。在它之前只有一个字符a,因此它的前缀和后缀都是空串,next[1]=0。
然后,我们考虑第三个字符c。它之前的子串是ab,前缀是a,后缀是b,二者不相等,所以next[2]=0。
接着,我们考虑第四个字符d。它之前的子串是abc,前缀是a、ab,后缀是c、bc,它们都不相等,所以next[3]=0。
接下来,我们考虑第五个字符a。它之前的子串是abcd,前缀是a、ab、abc,后缀是d、cd、bcd,它们都不相等,所以next[4]=0。
然后,我们考虑第六个字符b。它之前的子串是abcda,前缀是a、ab、abc、abcd,后缀是a、da、cda、bcda,它们都不相等,所以next[5]=0。
接着,我们考虑第七个字符c。它之前的子串是abcdab,前缀是a、ab、abc、abcd、abcda,后缀是b、ab、dab、cdab、bcdab,发现前缀ab和后缀ab相等,且长度为2,所以next[6]=2。
接下来,我们考虑第八个字符d。它之前的子串是abcdabc,前缀是a、ab、abc、abcd、abcda、abcdab,后缀是c、bc、dbc、cdbc、bcdc、abcdc,它们都不相等,所以next[7]=0。
然后,我们考虑第九个字符a。它之前的子串是abcdabcd,前缀是a、ab、abc、abcd、abcda、abcdab、abcdabc,后缀是d、cd、bcd、abcd、dabcd、cdabcd、bcdabcd,它们都不相等,所以next[8]=0。
最后,我们考虑最后一个字符b。它之前的子串是abcdabcda,前缀是a、ab、abc、abcd、abcda、abcdab、abcdabc、abcdabcd,后缀是a、ba、aba、daba、cdaba、bcda、abcda、dabcda,发现前缀aba和后缀aba相等,且长度为3,所以next[9]=3。
因此,模式串abcdabcdab的next函数值为[-1, 0, 0, 0, 0, 0, 2, 0, 0, 3]。
2. 计算nextval函数值:
根据上面计算出的next数组,我们可以得到nextval数组。
首先,nextval[0]=-1。
然后,我们计算nextval[1]。由于next[1]=0,所以nextval[1]=0。
接着,我们计算nextval[2]。由于next[2]=0,所以nextval[2]=0。
然后,我们计算nextval[3]。由于next[3]=0,所以nextval[3]=0。
接下来,我们计算nextval[4]。由于next[4]=0,所以nextval[4]=0。
然后,我们计算nextval[5]。由于next[5]=0,所以nextval[5]=0。
接着,我们计算nextval[6]。由于next[6]=2,且P[2]=P[6],所以nextval[6]=nextval[2]=0。
然后,我们计算nextval[7]。由于next[7]=0,所以nextval[7]=0。
然后,我们计算nextval[8]。由于next[8]=0,所以nextval[8]=0。
最后,我们计算nextval[9]。由于next[9]=3,且P[3]=P[6],所以nextval[9]=nextval[3]=0。
因此,模式串abcdabcdab的nextval函数值为[-1, 0, 0, 0, 0, 0, 0, 0, 0, 0]。
阅读全文