参看资料:《算法导论》
//这里的next和前面一样,next[i]就是前面长度为i的字符串前缀和后缀相等的长度,
//即索引为i的字符失配时的前缀函数
void getNext(char *str,int m){
memset(next,0,sizeof(next));
next[1]=0;
int k=0;
for(int i=2;i<=m;i++){
while(k>0 && str[k]!=str[i-1])
k=next[k];
if(str[k]==str[i-1])
k++;
next[i]=k;
}
}
//n为target字符串的长度,m为str字符串的长度,统计str在target中出现的个数
int match(char *target,int n,char * str,int m){
int k=0,cnt=0;
for(int i=0;i<n;i++){
while(k>0 && str[k]!=target[i])
k=next[k];
if(str[k]==target[i])
k++;
if(k==m){
cnt++;
k=next[k];
}
}
return cnt;
}
//n为target字符串的长度,m为str字符串的长度
//若存在str字符串,返回匹配成功的第一个字符的位置
int match(char *target,int n,char * str,int m){
int k=0,cnt=0;
for(int i=0;i<n;i++){
while(k>0 && str[k]!=target[i])
k=next[k];
if(str[k]==target[i])
k++;
if(k==m){
return i-m+1;
}
}
return -1;
}