贴一个我实现的kmp,在这里我的next数组的定义是,上一个前缀和我当前前缀相同的位置应该在哪里,next[0]=-1
ababac的next数组就是-1,-1,0,1,2-1
#include<iostream> using namespace std; int next[10001]; void getnext(char *s){ int i=1,j; next[0]=-1; while(s[i]!=‘\0‘){ j=next[i-1]; while(s[j+1]!=s[i]&&j!=-1) j=next[j]; if(s[j+1]==s[i]) next[i]=j+1; else next[i]=-1; i++; } } void kmp(char*s,char *t)//ÔÚsÖÐÕÒt£»{ getnext(t); int i=0,j=-1,n=strlen(t); while(s[i]!=‘\0‘){ while(t[j+1]!=s[i]&&j!=-1) j=next[j]; if(s[i]==t[j+1]) j++; if(t[j+1]==‘\0‘){ cout<<i-n+1<<endl;j=next[j-1]+1;} i++; } } int main() { char s[20002],t[20002]; while(gets(s)) { gets(t); kmp(s,t); } }
时间: 2024-10-12 15:58:10