算法有一个对模式字符串预处理的过程,计算出模式字符串每个字符对应位置的偏移值。这个偏移值被定义为可以作为后缀的最长前缀长度。
可以用一堆叠在一起的尖尖帽子来比喻:帽子每一层代表一个字符,不同的帽子,代表不同的前缀,如果可以摞在一起,就表示正好有相同的后缀。
前提是帽子顶部不能变,只是在底部截断。
这样求每个字符的偏移值,就是求每一层的可以摞起来最长子帽子(定义为向上截取)。
用递推法,若第q层已经计算好子帽子k(或者没有),那么第q+1层如果和k+1 相同,
那么其子帽子就是k+1.如果不等呢,只需要找子帽子k的子帽子再按上述规则即可。因为子帽子都是可以摞在一起的。中间找到一个没有子帽子的即可结束(为什么?) 直到帽子顶,也保证找到的第一个子帽子是最长的子帽子。