KMP算法
KMP算法讲解
#include<cstdio>
#include<cstring>
int next[100];
void getnext(char *ptr){//构造子串的next表
int i=0,k=-1;
next[0]=-1;
//加入假想的哨兵,哨兵可视为一个空串,
//它是任何串的前缀、子串、后缀,当第一个字符失配时,
//我们用第一个字符于哨兵比对,那么它必然和哨兵匹配
int n = strlen(ptr);
while(i<n){
if(k<0 || ptr[i] == ptr[k]){//匹配
i++;
k++;
next[i]=k;
}else{//失配
k=next[k];
//如果当前位置失配,查找已匹配部分公共前后缀位置,直接进行移动
}
}
for(int i=0;i<n;i++){
printf("%d ",next[i]);
}
}
int KMP(char *p,char *t){
int i=0,j=0;
int n=strlen(p);//父串
int m=strlen(t);//子串
getnext(t);//构造next查询表
while(i<n&&j<m){//自左向右,逐个比对字符
if(j<0 || p[i] == t[j]){//若匹配
i++;
j++;//则携手共进
}else{//否则,子串右移,父串不回退
j=next[j];
}
}
return i-j;
}
int main(){
char a[100]="sadafafdsdadfssaa";
char b[100]="ababaaababaa";
KMP(a,b);
return 0;
}