二.831(KMP)字符串详解

ne[3]枚举2次 

ne[4],枚举3次

ne[5],枚举4次]b在后面了,就一个b就不可能在前面了]b舍弃

ne[6],枚举i-1次]一眼看最长相等前后缀,就是aab,aab

ne[7],aaba,aaba

ne[8],枚举i-1次]aabaa,aabaa

同理

怎么快速看呢!我想把b给夹起来]把中间夹的数越多就多

其实

加的有规律,最多加一

减的规律,例ne[9]不匹配了,返回ne[8]找匹配里的aabaa再找  最长相等前后缀为2.

                                        aabaa长度5,找ne[5]=2所以是2        

代码

一直有相等,我们的j才能一直直线上升ne跟着一样上升,没有j才降到ne

next一样,比较主串时候也一样

-------------每次i循环i只移动一次,i为主指,只有相等的时候或者j==0时候才看下一个主指i

两个指针

第一行:p[2]=p[1]相等了,j=1]两个p分别代表i,j两个指针

第二行:

第三行:ne[2]=1

第一行:p[3]与p[2]不等,j=0空了

第二行:

第三行:ne[3]=0

第一行:

第二行:p[4]与p[1]相等,j=1

第三行:ne[4]=1

循环4次后ne[5]=2,ne[6]=3,ne[7]=4,

第一行:

第二行:p[5]与p[2]相等,j加到5

第三行:ne[8]=5

第一行:回调到这个前缀的末尾第二个a,j=ne[5]=2

再做while,a[9]不等于a[3],j=ne[2]=1

第二行:相等了,j=2

第三行:ne[9]=2

也可以这样

最长相等前后缀为5


讲一下我们的next数组心算(暂时歪门邪道方法)

这个ab的next无脑直接写01

从这个字符串末尾前一个字符往前看,最大相等前后缀,的下一个索引

总aba开始,看ab没有写

abab,看aba有相等a,看a索引下一个填2

ababa,看abab,有ab,看ab索引下一个填3

ababaa,看ababa,有aba,看aba索引下一个填4

ababaaa,看ababaa,有a,看a索引下一个填2

ababaaab,看ababaaa,有a,看a索引下一个填2

ababaaaba,看ababaaab,有b,看ab索引下一个填3


转自从0开始数up主

我们想要什么,匹配的前面如果有相等的,我就能跳过去,怎么跳,相等的对齐,比较相等的下一个

那比较C与B


转自:AI小辣鸡up主

 看nextval,

看next值与前面序号哪个一样,箭头指过去,看所指的单个子串

一样等于他的nextval

不一样直接等于我的next,拉下来

第一个无脑写零,

第二个与前面一不一样,不一样直接写我这第二个next下标1

第三个,a与a一不一样,一样就把他的nextval值给我0

 第四个2指2,b=b,要他的nextval值,1,

第五个3指3,a=a要他的nextval值,0,

第六个4值4,a与b不一样直接落4

第七个,2指2,a与b不一样直接落2

第八个,2指2,b与b一样,要他的nextval,1

第九个,3指3,a与a相等,要他的nextval,0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白天的我最菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值