KMP的核心就是他的Next函数, 看代码都要晕几次才能理解,要证明为什么这样子真的是头都大,不过我看过几个后觉得还可以改的更容易理解,就是当前字符先跟自己下标的字符比较,如果相等就是说下个字符的右偏移就是当前字符的下标的下一个位置, 否则再跟最开始那个字符比较, 如果也相等下个字符也可以偏移一位, 否则一定是0.
Code
public static int[] Next(string pattern)
{
int[] next = new int[pattern.Length];
char[] strArray = pattern.ToCharArray();
int j = 1;
int times = pattern.Length - 1;
next[0] = -1;
next[1] = 0;
while (j < times)
{
if (strArray[j] == strArray[next[j]])
{
next[j + 1] = next[j] + 1;
}
else if (strArray[j] == strArray[0])
{
next[j + 1] = 1;
}
j++;
}
return next;
}