private void getNextval(StringList T, int[] nextval) { int i, j; //代表第几个字符 i = 1; j = 0; nextval[1] = 0; for (i=2; i < nextval.Length; i++) { while (j > 0 && T[i] != T[j + 1]) { j = nextval[j]; } if (T[i] == T[j + 1]) { j++; } nextval[i] = j; } }
这里计算的就是匹配串的前index(包括index)的字符串的最长前后缀相同的字符个数
例如:ababaaaba,那么
"a",next[1] = 0
"ab",next[2] = 0
"aba",next[3] = 1
"abab",next[4] = 2
"ababa",next[5] = 3
"ababaa",next[6] = 1
"ababaaa",next[7] = 1
"ababaaab",next[8] = 2
"ababaaaba",next[9] = 3
这个数组的作用就是,比如说:你在主串ababatabssss中匹配ababaaaba,你会发现前面5个字符都是一样的,就是第5+1个不一样
普通的匹配模式,主串会从第二个开始ababaaabssss,而匹配串从头开始ababaaaba
但是因为有next数组的存在,next[5]的存在,匹配串回到next[5]=3,然后主串位置不变,比较第3+1位
ababatabssss
abababaaaba
这样就可以减少很多的匹配次数了