求字符串的next值的两种方法

这两天在研究关于字符串匹配的KMP算法,其中需要求串的next值,看了很多算法描述和代码,一开始有点绕,然后多看了几篇,慢慢就理解了。自己目前掌握的有两种求字符串next值的方法,下面用简单通俗的描述记录下来。

以字符串ababaaababaa(下文也称为字符串s)为例,其next值为011234223456,下面介绍两种求解方法,其中无论是字符串s或是next数组,下标均从1开始(注意不是0),即下标为1-12。且next前两个值默认设置为0,1:next[1]=0,next[2]=1。

一、前缀后缀匹配

1.通俗描述

若字符串长度为length,则next数组也有length个值,当求解第i个next值时(1 <= i <= length,其实next[1],next[2]可以不算的,因为无论怎么算都是0,1),取字符串s的前i-1个字符,再取这i-1个字符的最长前缀字符串front(前i-2个字符)和最长后缀字符串back(后i-2个字符),其实就是去掉这i-1个字符串的最后一个和最前一个。然后对front和back进行匹配,匹配到的字符串,必须是front的头,以及back的尾,(其实此处匹配的也可以理解成字符串的前缀集合和后缀集合的交集中最长的字符串)若匹配到的字符串长度为l,则next[i]=l+1,若没有匹配到,则next[i]为1。这个匹配部分这样讲有点难理解,看一下下面的求解过程就清楚了。

2.求解过程
  • 字符串s(ababaaababaa)长度为12,所以next数组长度也为12。
  • 默认next[1]=0,next[2]=1,不需要计算。
  • 求next[3],取字符串s前2个字符,即为ab,再求最长前缀字符串front为a
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值