int index_KMP(SString S, SString T, int next[]) {
int i = 1, j = 1;
while (i <= S.length && j <= T.length) {
if (j == 0 || S.ch[j] == S.ch[i])
i++, j++;
else
j = next[j];
}
if (j > T.length)return i - T.length;
else return 0;
}
KMP算法的核心
求next数组(本质上是已扫描主串的最长公共前后缀问题)
KMP算法:主串指针不会回溯
最坏时间复杂度为O(m+n)
仅在部分匹配中效率较高。
KMP算法的优化 用nextval数组优化next数组
核心(判断失配字符与下一跳匹配字符是否相同,相同则改为下一跳字符的next数组值)
nextval[1] = 0;
for (int j = 2; j <= T.length; j++) {
if (T.ch[next[j]] == T.ch[j])
nextval[j] = nextval[next[j]];
else
nextval[j] = next[j];
}