Kmp的next算法怎么进行,举个例子
时间: 2023-05-24 19:02:31 浏览: 46
A:KMP算法中的next数组是用于在匹配失败时快速移动模式串的指针位置,从而减少匹配次数的。其计算步骤如下:
1. 初始化next数组,令next[0]=-1,next[1]=0;
2. 循环遍历模式串中每个位置i(i从2开始),不断向前比较前缀和后缀:
a. 令j=next[i-1],表示当前位置的前一个位置的next值;
b. 如果模式串中i位置字符等于j+1位置字符,则next[i]=j+1;
c. 否则不断向前递归比较j位置的前缀是否等于后缀,即令j=next[j],直到j=0或i位置字符等于j+1位置字符,此时next[i]=j+1(如果一直递归到j=0还没找到相同的前后缀,则next[i]=0)。
举个例子,假设我们要匹配的字符串为"abcabcabda",它的next数组为:[-1, 0, 0, 0, 1, 2, 3, 4, 0, 1]。这个数组的含义是:
- next[0]=-1,表示第一个字符没有任何相同的前缀和后缀;
- next[1]=0,表示第二个字符的前缀和后缀都只有一个字符a;
- next[2]=0,表示第三个字符的前缀和后缀都只有两个字符ab,但是它们不相等;
- next[3]=0,表示第四个字符的前缀和后缀都只有三个字符abc,但是它们不相等;
- next[4]=1,表示第五个字符的前缀为a,后缀为ab,它们相等的长度为1;
- next[5]=2,表示第六个字符的前缀为ab,后缀为bc,它们相等的长度为2;
- next[6]=3,表示第七个字符的前缀为abc,后缀为abc,它们相等的长度为3;
- next[7]=4,表示第八个字符的前缀为abca,后缀为bcab,它们相等的长度为4;
- next[8]=0,表示第九个字符的前缀和后缀都只有一个字符d;
- next[9]=1,表示第十个字符的前缀为a,后缀为d,它们相等的长度为1。
接下来在KMP算法中匹配文本串时,当模式串无法匹配时,直接根据next数组移动模式串的指针,将匹配次数降为最小。