很多不理解. 先背下来吧
void get_next(String T, int *next) {
int i , j;
next[0] = 1;
i = 1;
j = 0;
while (i < T.size()) { // 循环遍历T
if (j == 0 || T[i] == T[j]) { // 相同则 往后移动 且存入next 数组
++i;
++j;
next[i] = j; // 1 普通kmp 算法
// 改进 kmp算法
if (T[i] != T[j]) {
next[i] = j;
}else { next[i] = next[j];
}else {
j = next[j]; // 不相同则j回溯
}
}
}
void index_KMP(String S, String T, int pos) { // 返回子串T, 在主串S种第pos个字符之后的位置. 如不存在 则返回 0
int i = pos; // i 用于主串S 单签位置下标值
int j = 1; // j用于子串T的下标值
int next[255];
get_next(T, next); // 获取T的next数组
while (i <= S.size() && j <= T.size()) { // 循环条件
if (j == 0 || S[i] == T[j]) { // 弱相同则继续往右移动
++i;
++j;
}else { // j返回合适的位置. i 则不变
j = next[j];
}
}
if (j > T.size()) {
return j - T.size();
}else {
return 0;
}
}