设目标串为t=abcaabbabcabaacbacba,模式串为p=abcabaa”编写程序计算模式p的nexvalB的值
时间: 2024-01-16 17:04:24 浏览: 31
好的,根据KMP算法的定义,我们需要先求出模式串p的next数组。这里给出next数组的求解过程:
- 首先,我们将模式串p分为两段:前缀和后缀。
p = a b c a b a a
前缀:a, ab, abc, abca, abcab, abcaba
后缀:a, aa, baa, abaa, cabaa, acabaa
- 对于每个前缀,求出其最长相等的前后缀长度。
a 的最长相等前后缀长度为 0。
ab 的最长相等前后缀长度为 0。
abc 的最长相等前后缀长度为 0。
abca 的最长相等前后缀长度为 1。
abcab 的最长相等前后缀长度为 2。
abcaba 的最长相等前后缀长度为 1。
- 将所有前缀的最长相等前后缀长度组成的序列称为模式串p的next数组。
p 的next数组为:[0, 0, 0, 1, 2, 1, 0]
接下来,我们需要求出nexvalB数组。nexvalB的定义是,对于模式串p的任意一个前缀p[0...i],nexvalB[i]表示在p[0...i]中,最长相等前后缀的长度,如果不存在相等前后缀,则nexvalB[i]的值为0。
nexvalB的计算可以通过next数组来实现。具体地,对于模式串p的任意一个前缀p[0...i],我们可以先求出其next值,即p[0...next[i]]和p[i-next[i]...i]相等的最大长度,然后再递归地计算nexvalB[next[i]]。递归的边界条件是,当next[i]=0时,nexvalB[i]=0。
下面是nexvalB数组的计算过程:
- 首先,我们将nexvalB数组初始化为0。
nexvalB = [0, 0, 0, 0, 0, 0, 0]
- 对于第一个前缀p[0],nexvalB[0]=0。
- 对于第二个前缀p[0...1],我们先求出其next值,即p[0...next[1]]和p[1-next[1]...1]相等的最大长度,由于next[1]=0,所以我们直接将nexvalB[1]赋值为0。
- 对于第三个前缀p[0...2],我们先求出其next值,即p[0...next[2]]和p[2-next[2]...2]相等的最大长度,由于next[2]=0,所以我们直接将nexvalB[2]赋值为0。
- 对于第四个前缀p[0...3],我们先求出其next值,即p[0...next[3]]和p[3-next[3]...3]相等的最大长度,由于next[3]=1,所以我们递归地计算nexvalB[next[3]]=nexvalB[1],即nexvalB[3]=nexvalB[1]=0。
- 对于第五个前缀p[0...4],我们先求出其next值,即p[0...next[4]]和p[4-next[4]...4]相等的最大长度,由于next[4]=2,所以我们递归地计算nexvalB[next[4]]=nexvalB[2],即nexvalB[4]=nexvalB[2]=0。
- 对于第六个前缀p[0...5],我们先求出其next值,即p[0...next[5]]和p[5-next[5]...5]相等的最大长度,由于next[5]=1,所以我们递归地计算nexvalB[next[5]]=nexvalB[1],即nexvalB[5]=nexvalB[1]=0。
- 对于第七个前缀p[0...6],我们先求出其next值,即p[0...next[6]]和p[6-next[6]...6]相等的最大长度,由于next[6]=0,所以我们直接将nexvalB[6]赋值为0。
最终,nexvalB数组的值为:[0, 0, 0, 0, 0, 0, 0]。
以上是模式串p的nexvalB数组的计算过程。