KMP算法特点是,为了避免回退,就设计了失败后,将子串指针向前回退的next数组
本章是设计next数组
设计思想
因为当k位不匹配的时候,前1~k-1位是匹配的
所以需要寻找前k位以前的前缀和后缀是否匹配
前缀,包含第一个字符,不包含最后一个字符的子串
后缀:包含最后一个字符,且不包含第一个字符的子串
当j匹配失败时候,将前面已匹配的串记为S,next[j] = S的最长相等前后缀 +1
规定next[1] = 0
总结:
如果是第一个不匹配,则返回到0,i,j各+1
然后在前面的已经匹配好的子串中,寻找长度相等的前后缀,前后缀并且相等,
next值为前后缀长度 + 1
特点声明next[1] = 0
KMP时间复杂度
1,时间来源于构造next数组,时间复杂度O(n)
2,遍历主串,时间复杂度O(m)
3,总体时间复杂度为O(m+n)
特点:
next[1] = 0
next[0] = 1
比朴素优秀的前提是,前面的子串和模式串部分匹配