C语言实现KMP模式匹配算法

void preKmp(char *x, int m, int kmpNext[]) {
   int i, j;

   i = 0;
   j = kmpNext[0] = -1;
   while (i < m) {
      while (j > -1 && x[i] != x[j])
         j = kmpNext[j];
      i++;
      j++;
      if (x[i] == x[j])
         kmpNext[i] = kmpNext[j];
      else
         kmpNext[i] = j;
   }
}


// text:y, len: n, match parttern:x, len: m
int KMP(char *y, int n, char *x, int m) {
   int i, j, kmpNext[m];

   /* Preprocessing */
   preKmp(x, m, kmpNext);

   /* Searching */
   i = j = 0;
   while (j < n) {
      while (i > -1 && x[i] != y[j])
         i = kmpNext[i];
      i++;
      j++;
      // if (i >= m) {
      // printf("j-i=%d\n",j - i);
      // i = kmpNext[i];
      // }
       if (i == m) {
            //printf("j-i=%d\n",j - i);
            return j - i;
            //i = kmpNext[i];
      }
   }
    return -1;
}

int strStr(char* haystack, char* needle) {
    int needleLen = strlen(needle);
    if(needleLen == 0) return 0;
    int hayLen = strlen(haystack);
    if(hayLen == 0) return -1;
    
    return KMP(haystack, hayLen, needle, needleLen);
}

猜你喜欢

转载自www.cnblogs.com/guxuanqing/p/9266333.html