next数组求解详解

next数组的求解方法是:

第一位的next值为0,第二位的next值为1,后面求解每一位的next值时,根据前一位进行比较。首先将前一位与其next值对应的内容进行比较,如果相等,则该位的next值就是前一位的next值加上1;如果不等,向前继续寻找next值对应的内容来与前一位进行比较,直到找到某个位上内容的next值对应的内容与前一位相等为止,则这个位对应的值加上1即为需求的next值;如果找到第一位都没有找到与前一位相等的内容,那么需求的位上的next值即为1。

这段话一开始看了好几遍都没彻底理解,看了好几个帖子,终于搞明白next数组具体如何求解。还是以例子说明具体求解过程
假设求串′ababaaababaa′的next数组

模式串ababaaababaa
下标123456789101112

1、前两位:next数组前两位一定是0,1 即前两位ab对应的next数组为01,则:

模式串ababaaababaa
下标123456789101112
next数组01

2、接下来看第三位,按照next数组求解方法。第三位a的前一位为第二位的b,b的next值为1对应内容为a,b与a不同,向前继续寻找next值对应的内容来与前一位进行比较。因为找到第一位都没有找到与前一位相等的内容,所以第三位a的next值为1,则:

模式串ababaaababaa
下标123456789101112
next数组011

3、接下来看第四位b,b的前一位a的next值1对应内容为a,相同,所以该位b的next值就是前一位a的next值加上1,即为2

模式串ababaaababaa
下标123456789101112
next数组0112

4、接下来看第五位a,a的前一位b的next值2对应内容为b,相等,所以该位a的next值就是前一位b的next值加上1,即为3

模式串ababaaababaa
下标123456789101112
next数组01123

5、接下来看第六位a,a的前一位a的next值3对应内容为a,相等,所以该位a的next值就是前一位a的next值加上1,即为4

模式串ababaaababaa
下标123456789101112
next数组011234

6、接下来看第七位a,a的前一位a的next值4对应内容为b,不相等,向前继续寻找next值对应的内容来与前一位进行比较,b的next值2对应的内容为b,依旧不相等,继续向前寻找,第二位b的next值1对应内容为a,相等。因为是在第二位b处实现的相等,所以第七位a的next值为第二位b的next值上加1,即为2

模式串ababaaababaa
下标123456789101112
next数组0112342

7、接下来看第八位,同样道理,得出b的next值为2

模式串ababaaababaa
下标123456789101112
next数组01123422

8、接下来看第九位,前一位b的next值2对应内容为b,相等,所以此处next值为3

模式串ababaaababaa
下标123456789101112
next数组011234223

9、第十位同理可得,为4

模式串ababaaababaa
下标123456789101112
next数组0112342234

10、第十一位a的前一位b的next值4对应内容为b,相等,所以此处next值为5

模式串ababaaababaa
下标123456789101112
next数组01123422345

11、最后,第十二位同理可以得到next值位6

模式串ababaaababaa
下标123456789101112
next数组011234223456

综上,串′ababaaababaa′的next数组为011234223456

评论 46
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值