刚刚笔试完创新工厂,里面考到了KMP,算我幸运,笔试之前才看过了KMP,大体上有一点了解。但是做题的时候还是出了一些问题。
书上和网上的代码下标都是从1开始的,可是在编程序的时候,大家都习惯从0开始。
接着,我就自己写了这个下标从0开始的KMP代码
如果有问题,欢迎大家拍砖。
#include <iostream> #include <string> using namespace std; void get_nextval(const char* T,int nextval[]) { int i = 0; nextval[0] = -1; int j = -1; while(i < strlen(T) -1 ) { if (j == -1 || T[i] == T[j]) { i++; j++; if (T[i] != T[j]) { nextval[i] = j; } else { nextval[i] = nextval[j]; } } else { j = nextval[j]; } } } int KMP(const char* S, const char *T,int next[]) { int i = 0; int j = 0; int slen = strlen(S); //如果下面写成i<strlen(T),如果i是负数,那么i会比stelen的结果大得 int tlen = strlen(T); //这样写是有原因的,大家可以查一查负数和无符号数的比较结果 while (i < slen && j < tlen) { if (j == -1 || S[i] == T[j]) { i++; j++; if (T[j] == '\0') { return i-j; } } else j = next[j]; } return -1; } int next[10]; int main() { string a = "aa"; string b = "aa9"; get_nextval(b.c_str(),next); cout<<KMP(a.c_str(),b.c_str(),next); }