#include <iostream>
#include <cstring>
using namespace std;
void getNext(const char *str, int *next) {
int i = 0, j = -1;
next[0] = -1;
while (i < strlen(str) - 1) {
if (j == -1 || str[i] == str[j]) {
++i;
++j;
next[i] = j;
} else {
j = next[j];
}
}
}
int KMP_index(const char *mainStr, const char *patternStr, int *next) {
int i = 0, j = 0;
cout << "patternStr length: " << strlen(patternStr) << endl;
cout << "mainStr length: " << strlen(mainStr) << endl;
int mainLen = strlen(mainStr);
int patternLen = strlen(patternStr);
while (i < mainLen && j < patternLen) {
if (j == -1 || mainStr[i] == patternStr[j]) {
++j;
++i;
} else {
j = next[j];
}
}
if (j >= strlen(patternStr)) {
return i - (int)strlen(patternStr);
} else {
return -1;
}
}
int main() {
const char *mainStr = "abbabababba";
const char *patternStr = "abab";
int *next = new int[strlen(patternStr)];
getNext(patternStr, next);
cout << "next array: ";
for (int i = 0; i < strlen(patternStr); ++i) {
cout << next[i] << " ";
}
cout << endl;
cout << KMP_index(mainStr, patternStr, next) << endl;
delete[](next);
return 0;
}
结果
next array: -1 0 0 1
patternStr length: 4
mainStr length: 11
3