关于KMP的一点思考
关于KMP的一点思考 KMP的 \(next\) 数组的性质很精妙,有必要开一个坑学习一下 Part 1 啥是next \(next[i]\) 表示对于 \(pre_i\) 这个字符串,这个抠出来的字符串本身后缀和前缀相等的最长长度。是一个自变量 只和这个子串有关的函数 。这点很重要 由于保证了是最长长度,这个数有一些优良的性质,常常在关于一个串的循环表示或者周期表示中发挥作用。 注意到这个 \(next[i]\) 虽然代表是这个最长长度,但是值得注意的是,由于字符串从1开始编号,所以这个值也是那个前缀的下标。 Part2 如何求next 边界条件是, \(nx[1]=0\) 。考虑我们若已经求得前面 \(i-1\) 的位置的 \(nx\) 值,现在如何求 \(nx[i]\) 。 把 \(S[1\dots i-1]\) 看做一个整体,现在我们在后面加入了一个字符 \(S[i]=c\) 。 我们现在就是要在 \(pre_{nx[i-1]}\) 中截一个最大的位置 \(p\) ,使得 \(S[p+1]=c\) ,而 \(p\) 虽然是下标,但是由于从 \(1\) 开始编号那么就同时就是这个串的长度,所以 \(nx[i]=p+1\) 。为什么是在 \(pre_{nx[i-1]}\) 中找呢?因为我们要保证 \(S[i-p+1...i]=S[1,p]\) 。 所以如何找 \(p\) 呢