1. KMP算法
kmp算法主要是解决 给出一个文本串 aabaabaaf, 再给一个模式串 aabaaf
看文本串中是否出现模式串, 因为暴力匹配的复杂度过高 O(m*n)
两个指针 j指向前缀末尾位置, j的值还代表i之前(包括i) 子串最长相等前后缀长度
i指向后缀末尾位置
next数组要记录最长相等前后缀长度, 要完成4个任务
1. 先初始化
2. 处理前后缀相同的情况
3. 处理前后缀不同的情况
4. 更新next数组值
void getNext(next, s){
j= 0; next[0] = 0
}
next第一个位置的数字被设置为0, j从0开始, i从1开始
for (i=1; i<s.size; i++){
while j>0 && s[i] != s[j]:
j = next[j-1]
if s[i]==s[j]:
j++
next[i] = j
}
如果i和j指到的元素相等, 那么j向后移动一位, next[i], next数组中对应i下标存入j的值, 然后i往后移动一位
如果i, j不相等, j要回退, j前一个next数组所对应的值, 回退到对应的下标, j = next[j-1], 遇到冲突需要连续回退, 所以要用while