2021-08-09

本文深入探讨了KMP算法中的next数组构造过程,详细解释了如何计算模式串的最长公共前后缀,并将其转化为用于比较的下标。通过实例展示了如何根据求得的下标数组与模式串进行比较,构建最终的next-val数组,以此提高字符串匹配的效率。文章适合对算法感兴趣的读者,尤其是希望理解字符串搜索算法的开发者。
摘要由CSDN通过智能技术生成

**

KMP算法next数组求解

**

要求那个next数组(有些叫next-val数组):
1.必须先求模式串S 每一个字符前面的那个字符串的最大公共前后缀长度,将这一系列长度存成一个数组,求出来的每个长度其实就是和模式串每一个对应位置上做比较的下标
例如:模式串是ABACABC的最长公共前后缀长度数组为:我们将最长公共前后缀长度记作LCPSF,现在从模式串第一个字符A开始,A的前面字符串为null,所以A之前的子串的LCPSF是0;来到B,B的前面字符串是A,A是单独的字符不存在公共前后缀,所以长度也是0;来到A,A前面的子串是AB,LCPSF为0;来到C,C前面的子串是ABA,LCPSF为1;来到A,A前面的子串是ABAC,LCPSF为0;来到B,B之前子串为ABACA,LCPSF为1;来到C,C前面子串为ABACAB,LCPSF为2;到此这个最长公共前后缀数组就出来了=【0,0,0,1,0,1,2】将这个数组从第二个值开始每个值加1=【0,1,1,2,1,2,3】就是将要和子串对应位置比较的下标## KMP算法求next 数组

2.求得模式串最长公共前后缀的数组T【n】后,把模式串每个位置上的字符与这个数组存的下标对应字符作比较:
上面求出了下标数组【0,1,1,2,1,2,3】现在来和模式串ABACABC每个位置作比较求最终next-val数组:
next-val数组第一个数直接为0。
next-val第二数:模式串第二个字符为B,对应的下标数组第二个数是1,那就是将模式串的第1个字符和B相比较,A!=B,所以直接将下标数组第二个数1作为next-val数组第二个数的值
第三个数:模式串第三个字符为A,对应下标数组第三个数为1,取其作为下标,找到模式串第1个字符为A,A=A,那取next-val的第一个数做为next-val第三个数的值,也就是0
。。。。。以此类推,模式串每一个位置的字符和对应下标位置的数相等就取next-val中对应的数填到next-val中当前位置,不等就直接取当前下标数组的值填到next-val当前位置中
注意,这里所有序号,包括模式串和下标数组的数,第一个位置都是1,而不是常用的0开始
序号: 1 2 3 4 5 6 7
模式串 A B A C A B C
下标数组 0 1 1 2 1 2 3
next-val 0 1 0 2 0 1 0

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值