朴素字符串模式匹配
#include<string.h>
#include<assert.h>
int NaiveStrMatching(const String & T,const String & P){
int p=0;
int t=0;
int plen=P.length();
int tlen=T.length();
if(tlen<plen){
return -1;
}
while(p<plen && t<tlen){
if(T[t]==P[p]){
p++;
t++;
}else{
t=t-p+1;
p=0;
}
}
if(p>=plen){
return (t-plen+1);
}else{
return -1;
}
}
KMP 算法
#include<string.h>
#include<assert.h>
int *Next(String P){
int m=P.strlen();
assert(m>0);
int *N=new int[m];
assert(N!=0);
N[0]=0;
for(int i=1;i<m;i++){
int k=N[i-1];
while(k>0 && P[i]!=P[k]){
k=N[k-1];
}
if(P[i]==P[k]){
N[i]=k+1;
}else{
N[i]=0;
}
}
return N;
}
int KMPStrMatching(String T,String P,int *N,int startIndex){
int lastIndex=T.strlen()=P.strlen();
if((lastIndex-startIndex)<0){
return -1;
}
int i;
int j=0;
for(i=startIndex,;i<T.strlen();i++){
while(P[j]!=T[i] && j>0){
j=N[j-1];
}
if(P[j]==T[j]){
j++;
}
if(j==P.strlen()){
return (i-j+1);
}
}
return -1;
}