一种字符串匹配算法。
上这个字,没匹配上,于是我们直接把子串拉倒上这里就行了。
只要没匹配上我们就直接转移到最后一个需要匹配的那个位置,进行重新匹配。
注意看这个细节,虽然整个句子匹配失败了,但是
我的子句中,有跟子句开头部门一样的地方,而子句中第二次出现跟开头一样的部分这里恰好成功了。所以,我们的子句要调到恰好成功的位置上进行再次进行比较。
建立一个next表,用来回溯过去。
next表说白了就是当匹配失败了之后,该往哪里去跳转
子串的指针去跳转到哪里。
一定要明白,什么叫后缀?后缀一定是有后的,有最后一个字的叫后缀
什么叫前缀,有第一个字叫前缀
当"江"字匹配失败之后
他的前缀字符串是 望江楼上望
望江楼上望 最长相同前后缀 就是江子,长度是1.
同理这个江匹配失败的话,前面的长串中,最长相等的前后缀是望江
所以长度是2,所以子串回溯到2那个位置去,因为望江两个字都判断成功了。
kmp算法的本质就是,长串一直走,子串跟着走,长串判断失败时候子串就回溯了,回到自己该去的位接着去走。
这个算法差一点的问题是
长串和短串一开始就没匹配到一起就,那长串不动
短串又调到0这个位置,相当于长短串是万万没变化
而且再进循环时候,还是这个问题,长短串没变化。
大神算法,倘若当前子串在0的位置,没匹配上的话,会调到一个特殊位置,就是索引变成-1
要求-1这个状态百分百进匹配循环,进了匹配循环自然是匹配不上的,然后-1+1变成0,子串去了正确的位置又是0这个位置,然后主串还动了,往后走了。
最难得部分是,那个Next表该怎么写
最核心算法,如何去建立一个Next表。
package org.example.sort;
public class KMP {
public static void