看了半天,还是糊里糊涂,先放这,回过头再看
#include<stdio.h> #include<string.h> //求解next[]简化版本 void getnext(char p[],int next[]) { int i=0,j=-1,len=strlen(p); next[0]=-1; while(i<len){ if(j==-1||p[i]==p[j]){ i++;j++;next[i]=j; } else j=next[j]; } } //求解next[]理解版本 void getnext(char p[],int next[]) { int i=0,j=-1,len=strlen(p); next[0]=-1; while(i<len) { if(j==-1)//最长真前缀和最长真后缀的长度为-1,从模式的开始0继续找 { next[i+1]=0; i++;j++; } else if(p[i]==p[j])//已知i+1之前的最长真前缀和真后缀的长度为j //如果p[i]==p[j]那么i+1的长度为j+1 { next[i+1]=j+1; i++;j++; } else j=next[j];//否则,将检查p[next[j]]是否与p[i]相等 } } int kmp(char s[],char p[],int next[]) { int i=0,j=0,lens=strlen(s),lenp=strlen(p); while(i<lens&&j<lenp) { if(j==-1||s[i]==p[j]) { i++; j++; } else j=next[j]; } if(j==lenp)return i-lenp; else return -1; }
版权声明:本文为博主原创文章,未经博主允许不得转载。