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); }
C语言实现KMP模式匹配算法
猜你喜欢
转载自www.cnblogs.com/guxuanqing/p/9266333.html
今日推荐
周排行