void KMP(char* s, char* p) {
int s_len = strlen(s);
int p_len = strlen(p);
// generate next-array;
vector<int> next;
next.push_back(-1); // -1, 0...;
for (int i = 1; i < p_len; i++) {
int n = -1;
int j = i;
while (j > 0) {
j = next[j-1] + 1;
if (p[i] == p[j]) {
n = j;
break;
}
}
next.push_back(n);
}
// find pattern string;
int j = 0;
for (int i = 0; i < (s_len - p_len + 1); i++) {
while (i < s_len && j < p_len) {
if (s[i] == p[j]) {
i++;
j++;
} else {
if (j == 0) {
i++;
} else {
j = next[j-1] + 1;
}
}
}
if (j == p_len) {
printf("start = %s \n", s + i - p_len);
break;
}
}
}
KMP
最新推荐文章于 2019-03-22 21:00:45 发布