kmp算法中next数组如何确定
时间: 2023-07-20 08:40:47 浏览: 106
KMP算法中next数组求法.docx
5星 · 资源好评率100%
确定next数组的过程可以分为两步:
1. 求解模式字符串的最长公共前后缀长度
遍历模式字符串,对于每个位置i,求出它前面的子串的最长公共前后缀长度。具体地,假设模式字符串为p,那么对于位置i,求解的过程如下:
- 令j=i-1,初始化next[i]=0
- 如果p[i] == p[next[j]],说明i和j位置上的字符相等,可以将next[i]设置为next[j]+1
- 如果p[i] != p[next[j]],说明i和j位置上的字符不相等,需要缩小j的范围,令j=next[j],继续比较p[i]和p[next[j]],直到找到相等的位置或者j=0为止。在这个过程中,如果j=0,说明i位置上的字符没有和前面的任何字符匹配,因此next[i]=0。
2. 根据最长公共前后缀长度求解next数组
通过上面的过程,我们可以得到模式字符串p中每个位置的最长公共前后缀长度,但是这些长度并不一定就是next数组中的值。为了将这些长度转换成next数组中的值,需要进行如下处理:
- 令next[0]=-1
- 对于位置i(i>0),令next[i]=j,其中j是满足以下条件的最大的整数:
- j<i
- p[0]~p[j-1]和p[i-j]~p[i-1]是相等的子串
通过这样处理,最终得到的next数组就是KMP算法中所使用的next数组。
阅读全文