#include <stdio.h> #include <string.h> void GetNext(const char *p, int next[]) { int i = 0; int j = -1; next[i] = j; int len = strlen(p); while (i < (len - 1)) { if ((j == -1) || (p[i] == p[j])) { ++i; ++j; next[i] = j; } else { j = next[j]; } } } int index_KMP(const char *src_str, const char *pattern_str) { int next[255] = {0}; GetNext(pattern_str, next); int i = 0; int j = 0; int src_len = strlen(src_str); int pattern_len = strlen(pattern_str); printf("src_len = %d pattern_len = %d\n", src_len, pattern_len); for (int cc0=0; cc0<pattern_len; ++cc0) { printf("next[%d] = %d\n", cc0, next[cc0]); } while ((i < src_len) && (j < pattern_len)) { if ((j == 0) || (src_str[i] == pattern_str[j])) { ++i; ++j; printf("i=%d j=%d\n", i, j); } else { printf("j %d come back to %d\n", j, next[j]); j = next[j]; } } if (j >= pattern_len) { return i - pattern_len; } else { return 0; } } int main() { const char *src_str = "this is a test, abaaccdabaaddeabaabcac , hello world"; const char *pattern_str = "abaabcac"; int index = index_KMP(src_str, pattern_str); printf("index = %d\n", index); }
浙公网安备 33010602011771号