#include <iostream> #include <cstring> #include <cstdlib> using namespace std; const int MAX = 100; int nextVal[MAX]; void get_next(char t[]){ int len = strlen(t); int i=1; int j=0; nextVal[1]=0; while(i < len){ if(j==0 || 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(char s[],char t[]){ int len_s = strlen(s); int len_t = strlen(t); int i,j; i = 0; j = 0; while(i<len_s && j<len_t){ if(s[i] == t[j]){ i++; j++; }else{ j = nextVal[j]; i++; } if(j == len_t) break; } if(j == len_t) return i-j; else return -1; } int main() { char s[] = {'a','b','a','b','c','a','b','d','\0'}; //char t[] = {'a','b','a','b','c','a','b','d','\0'}; char t[] = {'b','a','\0'}; int kmp; get_next(t); kmp = KMP(s,t); cout<<kmp<<endl; cout << "Hello world!" << endl; return 0; }
时间: 2024-10-09 03:27:26