KMP算法的原理就是利用相匹配的前缀子串与后缀子串,来确定失配时下次对齐的位置;
其中最关键的就是next数组的确立;
数据结构课本上KMP算法next数组计算经典的例子:
void getNext(const char *pStr, int *nextArr)
{
int i = 0, k = -1, pLen = strlen(pStr);
nextArr[i] = k;
int mLen = pLen - 1;
while (i < mLen)
{
if (k == -1 || pStr[i] == pStr[k])
{
nextArr[++i] = ++k;
}
else k = nextArr[k];
}
}
而这个KMP算法next数组计算只关注了前k-1个字符中,前后匹配的子串,没有利用到当前失配的字符;
比如:ABACA,当第2个A失配时,说明被匹配串的当前位置的字符必定不等于A,所以将第0位对齐到此位也必定失配,所以应该继续回溯到第0位失配时所需要对齐的位,这里也就是-1;
这个"必定不等于(!=)"是可以被利用的!我们对KMP算法next数组计算的优化正是基于此;
废话不多说,下面是优化后的KMP算法next数组计算与注释: