KMP算法
如何理解next数组求解过程,如何理解配对中找出错位前一位?
KMP算法用于解决字符串匹配问题
可以用该题练习 Leetcode 28. 实现 strStr()
以下主要解释求解next数组和利用next数组配对的过程中比较难懂的地方,建议了解过kmp算法再看
next数组有很多种形式,有些人将next数组右移一位,有些人将next数组-1,本文表示的next数组是原始的既没有右移也没有-1,至于为什么右移、-1本文不做解释,原理其实是一样的,没什么不同,看个人理解和习惯。
1.配对
举例:
样本串:aabaabac
模式串:aabac
next: 01010
为什么配对的时候,找到不匹配那一项的时候,需要找前一项的next数组值?
因为next数组代表的是相等前后缀,例如上面例子中样本串配对到下标4->a
的时候模式串到下标4->c
两者不相等,此时找c
的前一位的next数组值,next数组值代表的含义是当前长度的字符串的最大前后缀长度,此时c
前一位的next数组值代表的是aaba
的最大前后缀长度为1,也就是从开头数一位和从末尾数一位的字符串是相同的,这样有什么含义呢?
因为样本串和模式串匹配出错的位数的前一位所代表的串肯定相同也就是aaba
,相同的串又有为1的相等前后缀,样本串中可以拿后缀来当作新的前缀,模式串可以跳过前缀直接从前缀后开始匹配
如何理解样本串中可以拿后缀来当作新的前缀,模式串可以跳过前缀直接从前缀后开始匹配
是关键
例如例子:
此时出错下标4前面的字符串aaba是样本串和模式串中相等的
样本串:aabaa,此时拿出错下标4的前面长度为1的字符串当作重新开始配对的前缀,也就是aaba
a将这一位a当作新的样本串前缀,这一位前缀不需要再进行对比,直接从这一位的后一位下标4开始对比,也就是样本串aaba
abac从下标4开始对比
而模式串中,aa