网上有很多讲得好的博客,这里简单说一下原理和实现过程就行了。
原理就是当出现一个字符不匹配时,将当前最长相同前缀移上来,例
.......Aa......
Bc...Bb..
Bc...Bb..
假设A串与B串相同,可是a与b不匹配,那么如果这是我们一个一个移的话就会很慢,所以我们可以考虑预处理出一个最长的前缀与后缀相同,这时我们只需把Bc移上来,比较a与c是否相同就行了。
那么我们需要预处理出一个next数组,表示最长的相同前缀与后缀。
首先,若没有最长的前缀与后缀,那么next[i]=-1,每一次求next[i]时,先令k=next[i-1],然后每次比较a[k+1]与a[i],若相同则next[i]=k+1,若不同则k=next[k]继续比较。