KMP 算法实践

很多不理解. 先背下来吧

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;
    }
}

你可能感兴趣的:(KMP 算法实践)