next函数是指当前待匹配的字符失配的时候,当前字符之前的字符串的最大相同前后缀的长度。(匹配当前字符,求得next函数对应的是下一个字符的next值。何解?使用next函数都是在比对当前字符失败的情况下,调用当前字符之前字符串的最大相同前后缀)
如何分析求模式串的next函数?
求模式串中第j+1个字符的next函数
1.匹配第j个字符的时候,第j个字符之前已经有最大公共字符串的个数为k;(记为next[j] = k)
2.若第j个字符和第k+1个字符相等,则第j+1个字符之前的最大公共子串为k+1;(记为next[j+1] = k+1)
3.若第j个字符和第k+1个字符不等,则需要将第j个字符之前的最大公共前缀获得为t(记为t = next[j] = k),第t+1个字符和第j个字符匹配,则进入2步骤,直到相等或者到首个字符(记为k = next[0] = -1)还不等为止;
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
算法复杂度:O(m+n)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
next函数求解优化
当前字符串字符s[i]不等于模式串p[j],模式串j=next[j],此时的p[j]如果与回溯之前的p[j]相等,则显然与模式串的值不等,模式串需要再次回溯j=next[j]。那么问题来了,为什么如果回溯后对应的字符一直相等,为什么不一直回溯呢?因为一直匹配过程中,只要第一次匹配成功,则不会进入第二次的匹配。所以上述的问题根本不会存在。