设目标串为t="abcaabbabcabaacbacba",模式串为p="abcabaa" 计算模式p的nexval的值;画出利用KMP算法进行模式匹配时每一趟的匹配过程
时间: 2023-12-30 16:06:39 浏览: 142
根据KMP算法,需要先计算出模式串p的next数组,其中next[i]表示前缀p[0:i-1]的最长相等前缀后缀长度。
计算nexval时,采用类似的思路,将p的next数组进行拓展,得到nexval数组。其中nexval[i]表示当p匹配到第i个字符时,如果下一位不匹配,应该跳到的位置。
计算nexval数组时,需要依次考虑所有可能的前缀后缀长度。具体而言,对于每个i,从i-1开始往前找一个最长的j,使得p[0:j-1]既是p[0:i-1]的后缀,也是p[1:i]的前缀。然后,nexval[i]就等于nexval[j],或者是j本身(如果不存在这样的j)。
根据上述算法,可以计算出p的nexval数组为[0, 0, 0, 1, 2, 0, 1]。
接下来,画出利用KMP算法进行模式匹配时每一趟的匹配过程。具体过程如下:
1. 将目标串t的第一个字符与模式串p的第一个字符进行比较,发现匹配。
t: abcaabbabcabaacbacba
p: abcabaa
↑
2. 将目标串t的第二个字符与模式串p的第二个字符进行比较,发现匹配。
t: abcaabbabcabaacbacba
p: abcabaa
↑
3. 将目标串t的第三个字符与模式串p的第三个字符进行比较,发现匹配。
t: abcaabbabcabaacbacba
p: abcabaa
↑
4. 将目标串t的第四个字符与模式串p的第四个字符进行比较,发现不匹配。此时,根据nexval[3]=1,将模式串p向右移动1位。
t: abcaabbabcabaacbacba
p: abcabaa
↑
5. 将目标串t的第四个字符(即上一步未匹配的字符)与模式串p的第二个字符进行比较,发现不匹配。此时,根据nexval[1]=0,将模式串p向右移动0位。
t: abcaabbabcabaacbacba
p:abcabaa
↑
6. 将目标串t的第四个字符(即上一步未匹配的字符)与模式串p的第一个字符进行比较,发现不匹配。此时,根据nexval[0]=0,将模式串p向右移动0位。
t: abcaabbabcabaacbacba
p:abcabaa
↑
7. 将目标串t的第四个字符(即上一步未匹配的字符)与模式串p的第一个字符进行比较,发现不匹配。此时,根据nexval[0]=0,将模式串p向右移动0位。
t: abcaabbabcabaacbacba
p:abcabaa
↑
8. 将目标串t的第五个字符与模式串p的第一个字符进行比较,发现匹配。
t: abcaabbabcabaacbacba
p: abcabaa
↑
9. 依次类推,直到找到所有匹配的位置。