已知主串s=“abcaabbabcabaacbacba”.模式串pat=“abcabaa”,写出模式串的失败函数,并由此画出KMP算法匹配的全过程
时间: 2024-09-27 17:04:33 浏览: 13
KMP算法是一种高效的字符串搜索算法,用于查找主串(text)中是否存在给定的模式串(pattern)。失败函数(failure function),也称为部分匹配表(partial match table),是用来帮助我们在遇到前缀不匹配时快速回溯的辅助工具。
对于模式串pat="abcabaa":
1. 首先,我们创建失败函数表。它存储的是模式串中每个前缀的最大后匹配值。例如,'a': -1 (没有后匹配),'ab': -1,'abc': 0(自身是最大后匹配),'abcd': 1(最长的前缀'abc'加上'a'),依此类推。最终的失败函数表为:
```
failure = [-1, -1, 0, 1, 2, 0]
```
2. 匹配过程开始:
- 比较s的第一个字符 'a' 和 pat 的第一个字符 'a',它们匹配;
- 继续比较 'b', 'c',依次匹配;
- 到了 'd',不匹配,我们查看失败函数,由于 'd' 后面有 'abc' 这个匹配的前缀,所以从 'c' 开始向前查找,即回溯到索引2,继续比较 'b' 和 'a'(匹配),然后是 'a'(再次匹配);
- 继续这个过程,直到遍历完 pat,如果没有完全匹配的子串,则返回当前的匹配位置作为结果,如果匹配成功,则继续寻找下一个模式串的位置。
KMP匹配的全过程可以用图形表示为一系列步骤,其中包含成功的匹配步长、回溯的步骤以及匹配失败后的移动。在整个过程中,通过失败函数可以避免无效的重复比较,提高了效率。
相关问题
设目标串为t=abcaabbabcabaacbacba,模式串为p=abcabaa编写程序计算模式p的nexval的值
好的,根据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]
以上是模式串p的next数组的计算过程。
设目标串为t=abcaabbabcabaacbacba,模式串为p=abcabaa”编写程序计算模式p的nexvalB的值
好的,根据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数组的计算过程。