朴素算法
#include <iostream>
#include <cstring>
using namespace std;
int FindSubString(char* s,char* t){
int sflag=0,tflag=0;
int slen=strlen(s);
int tlen=strlen(t);
while(sflag<slen&&tflag<tlen){
if(s[sflag]==t[tflag]){
sflag++;
tflag++;
}
else{
sflag-=tflag-1;
tflag=0;
}
}
//tlen==tflag,f[tflag]='\0'
if(tflag==tlen)
return sflag-tflag;
else
return -1;
}
int main(){
char s[]={"goodgoogle"};
char t[]={"google"};
cout<<FindSubString(s,t);
}
KMP算法
#include <iostream>
#include <cstring>
using namespace std;
//get the next array
void GetNext(char* t,int* next){
int k=-1;
int tlen=strlen(t);
int tflag=0;
next[0]=-1;
while(tflag<tlen-1){
if(k==-1||t[k]==t[tflag]){
++tflag;
++k;
next[tflag]=k;
}
else
k=next[k];
}
}
int KMP(char* s,char* t){
if(!s || !t) return -1;
int slen=strlen(s);
int tlen=strlen(t);
int* next=new int[tlen];
GetNext(t,next);
int sflag=0,tflag=0;
while(sflag<slen && tflag<tlen){
if(s[sflag]==t[tflag] || tflag==-1){
++sflag;
++tflag;
}
else
tflag=next[tflag];
}
if(tflag==tlen)
return sflag-tflag;
else
return -1;
}
int main(){
char s[]={"goodgoogle"};
char t[]={"google"};
cout<<KMP(s,t);
}
进一步改进GetNext函数
void GetNext(char* t,int* next){
int k=-1;
int tlen=strlen(t);
int tflag=0;
next[0]=-1;
while(tflag<tlen-1){
if(k==-1||t[k]==t[tflag]){
++tflag;
++k;
if(t[tflag]!=t[k])
next[tflag]=k;
else
next[tflag]=next[k];
}
else
k=next[k];
}
}