KMP 算法

KMP算法 经常忘记它的内涵,在这里记录一下 希望能记住

KMP算法全称是 Knuth-Morris-Pratt 算法 KMP算法是其简称,用于处理字符串的模式比较,B串是否是A串的子串。 如果采用暴力方法,时间复杂度是 O(m*n)。KMP算法让子串在发现不匹配时,尽可能地向后移动。 需要子串的部分匹配表,即next数组,next数据的求解方法如下。next数组的意义是让算法尽可能地绕过无效的字符序列

void getNext(char *p, int* next) {
  next[0] = -1;
  int i = 0, j = -1;
  while (i < strlen(p)) {
    if (j == -1 || p[i] == p[j]) {
      i++;
      j++;
      next[i] = j;
    } else {
      j = next[j];
    }
  }
}
int kmp(string s_primary, string s_mode, int pos, int *next) {
  int i = pos;
  int j = 1;

  int len_p = s_primary.size();
  int len_m = s_mode.size();

  while (i < len_p && j < len_m) {
    if (j == 0 || s_primary[i] == s_mode[j]) {
      i++;
      j++;
    } else {
      j = next[j];
    }
  }

  if (j >= len_m) {
    return i = len_m;
  } else {
    return 0;
  }
}

kmp 算法的时间复杂度是 O(n+m),就是在匹配失败时,总能让子串回退到某个位置,让text不用回退。

Written on October 18, 2019