先上定义:主串和模式串
免得后面的沟通理解有出入。
首先,要理解KMP算法的核心思想:为什么要算next[]数组?数组中每个元素表示什么意思?
核心思想就是模式串的某个元素(设为t[i])前的k个元素和该串开头k个元素分别相同,因此如果在模式串的t[i]处匹配失败,模式串的指针没必要完全回溯,只需要回溯到t[k]即可,这样一来主串指针也不用回溯了。而我们用数组就是要记录t[i]位置对应的k值,next数组中每个元素就表示模式串对应位置的前面有k个元素与开头元素分别相等。
如果理解了上边这个(当然也可能是我表达的不清楚),也就是理解了KMP算法的核心,就可以理解算法中计算next数组的k=next[k]这条语句了,用一句话概括就是:
计算next数组的函数本质上是开头k个元素组成的串与整个串的模式匹配的过程!匹配结果就保存在next数组中(i元素前面k个字符和开头k个字符匹配成功,保存为next[i]=k)。
也就是说计算next数组的函数本质上是用KMP算法计算的!而k = next[k],本质上是一个指针回溯,就是KMP算法中的模式串的指针回溯。
这就有意思了朋友们,我们就是要计算next数据来进行KMP算法的,你现在跟我说计算next数组要用到KMP算法?套娃吗