kmp,next带优化
#include<iostream> #include<bits/stdc++.h> using namespace std; void getnext(char p[],int next[]){ next[0]=-1; int i=0,j=-1; int n=strlen(p); while(i<n-1){ if(j==-1||p[i]==p[j]){ i++; j++; if(p[i]!=p[j]) next[i]=j; else next[i]=next[j]; } else j=next[j]; } } int kmp(char s[],char p[],int next[]){ int i=0,j=0; int slen=strlen(s); int plen=strlen(p); getnext(p,next); while(i<slen&&j<plen){ if(j==-1||s[i]==p[j]){ i++; j++; } else j=next[j]; } if(j==plen){ return i-j+1; } else return -1; } int main(){ char s[]="ababxbababcadfdsss"; char p[]="ba"; int next[20]={0}; cout<<kmp(s,p,next)<<endl; //输出next for (int i = 0; i < strlen(p); ++i){ printf("%d ",next[i]); } }
0 条评论