算法是什么?算法就是数学规律.怎么去总结和发现这个规律,就是理解算法的过程.以下将搜寻的字符串称为子串(part),以P表示.被搜寻的字符串称为总串(total),以T表示.
KMP算法的本质是穷举法,而并不是去创造新的匹配逻辑.
部分匹配表是KMP算法的核心。只要理解了部分匹配表,就基本理解了KMP算法。普通匹配模式
规律是什么?就是在匹配过程中,遇到某一位不匹配时.start与end下一次的起点位置选择.对于普通匹配而言,start的变化永远是右移一位,end永远是从0开始,并且每次右移一位.
T.charAt(start+end)!=P.charAt(end)第二条规律,未知无法跳过
T.substring(start,start+end)==P.substring(0,end)
因为它不相等,所以它相等,这句话前后顺序不能颠倒.这虽然很像废话,但是确实KMP算法的核心.
这次的end位一定是下次比较的起点这里有个特殊的地方,就是首位不同时的逻辑,代码中也是一样,先按下不表.
假设 P = aaaab
为什么可以复用呢?因为P.charAt(end)我们一定知道什么,但是T.charAt(start+end)却有很多种可能,因为它只需要与P.charAt(end)不相等
我们可以发现,start下一次的位置为 start +( end - P.substring(0,end)的重合度). (end - 重合度) 其实就是start需要位移的距离
end下一次的位置为 P.substring(0,end)的重合度
但是由于P.substring(0,0)为空字符串,比较特殊,首位不同时,start是直接右移一位
故令next[0] = -1 , 当 next[end] < 0时,下一次的end位置指向 0
获取next数组
我们将end位不同时,P.substring(0,end)它的子串与自身的重合度,称之为部分匹配表Tips:
KMP算法的本质就是通过穷举end位不匹配时start与end的移动轨迹,来达到复用的效果.
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |