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