KMP算法解析
介绍一种高效的KMP算法:代码可以直接运行
#include <iostream> #include <iomanip> using namespace std; void preKmp(char* s,int len,int* next) { int i=0,j=-1; next[0]=-1; while(i<len) { while(j>-1 && s[i]!=s[j]) j=next[j]; i++; j++; if(s[i]==s[j]) next[i]=next[j]; else next[i]=j; } } int KMP(char*s,char* p) { int sn=strlen(s); int sp=strlen(p); int* next=new int[sp]; preKmp(p,sp,next); int i=0,j=0; while(i<sn) { while(j>-1 && s[i]!=p[j]) j=next[j]; i++; j++; if(j>=sp) { return i-j; } } return -1; } int main(int argc, char* argv[]) { char* p="abcdabceabcde"; char* s="abcdabcdabceabcde"; int pos=KMP(s,p); cout<<pos<<endl; return 0; }