补充 kmp算法
- kmp算法是基最长的前后缀和
- 我们把模式串和查找串放在一起,如果他们前后缀长度等于模式串,说明我们找到对应的位置
- 假设现在遍历到第i 个节点,前一个节点的前后缀长度是p[i-1]
- 如果s[i]==s[p[i-1]] 说明可以延续之前的最长p[i]=p[i-1]+1
- 如果不等于,我们可以以前一个节点结尾的第二个最长的前后缀长度,也就是 p[p[i-1]-1]
- 因为可以确定的是 s[0:p[i-1]-1]的长度是之前相等的前缀,我们想找的第二长的前后缀长度就是字符串s[0:p[i-1]-1]的最长前后缀长度
- 注意这里字符串的表示方法两边都能取到
- 不断循环找到最长的前后缀长度
我们找的前后缀长度不包括自身,也就是一个字母的最长前后缀长度是 0
- 这样我们初始比较可以和第一个进行比较(也就是索引 0 的节点 此时p[i-1]=0)