其实核心难点在于next数组的求解。kmp算法的本质就是想偷懒。代入自己的大脑,如果你在比较两个字符串时只有最后一位不一样,接下来你会怎么做呢。你的做法就是kmp的做法
#include<iostream>
#define maxlen 200
typedef struct stringnode{
char ch[maxlen];
int length;
}sstring;
int index(sstring s,sstring t){
int k=1;
int i=k;int j=1;
while(i<=s.length&&j<=t.length){
if(s.ch[i]==t.ch[j]){
++i;
++j;
}
else{
k++;
i=k;
j=1;
}
}
if(j>t.length)
return k;
else
return 0;
}
void get_next(sstring t,int next[]){
int i=1;
int j=0;
next[1]=0;
while(i<t.length){
if(j==0||t.ch[i]==t.ch[j]){
++i;
++j;
next[i]=j;
}
else{
j=next[j];
}
}
}
int kmp(sstring s,sstring t){
int i=1;
int j=1;
int next[t.length+1];
get_next(t,next);
while(i<=s.length&&j<t.length){
if(j==0||s.ch[i]==t.ch[j]){
++i;
++j;
}
else{
j=next[j];
}
}
if(i>t.length)
return i-t.length;
else
return 0;
}
int next[30];
int main(){
return 0;
}