标签:kmp
MP模板:
/*
MP算法
*/
void getFail(int* P,int* f)//失配函数
{
f[0]=f[1]=0;
for(int i=1; i<m; i++){
int j=f[i];
while(j&&P[i]!=P[j]){
j=f[j];
}
f[i+1]=(P[i]==P[j]?j+1:0);
}
}
int Find(int* T,int* P,int* f)//匹配函数
{
getFail(P,f);
int j=0;
for(int i=0; i<n; i++){
while(j&&P[j]!=T[i]){
j=f[j];
}
if(P[j]==T[i]){
j++;
}
if(j==m){
return i-m+1;
}
}
return -1;
}KMP模板:
/*
KMP
*/
int kmpmatch(int aa[],int bb[]){
int i=0,j=0;
int slen=a;
int plen=b;
while(i<slen&&j<plen)
{
//①如果j = -1,或者当前字符匹配成功(即aa[i] == bb[j]),都令i++,j++
if(j==-1||aa[i]==bb[j])
{
i++;
j++;
}
else
{
//②如果j != -1,且当前字符匹配失败(即aa[i] != bb[j]),则令 i 不变,j = Next[j]
//Next[j]即为j所对应的Next值
j=Next[j];
}
}
if(j==plen) return i-j+1;
else return -1;
}
//递推求得Next数组,代码如下所示:
void getNext(int bb[],int Next[]){
int plen=b;
Next[0]=-1;
int pre=-1;//前缀
int last=0;//后缀
while(last<plen-1){
if(pre==-1||bb[last]==bb[pre]){
++last;
++pre;
if(bb[last]!=bb[pre])
Next[last]=pre;
else
Next[last]=Next[pre];
}
else{
pre=Next[pre];
}
}
}标签:kmp
原文地址:http://blog.csdn.net/u013050857/article/details/45503735