码迷,mamicode.com
首页 > 其他好文 > 详细

模板-KMP

时间:2015-05-05 16:30:01      阅读:182      评论:0      收藏:0      [点我收藏+]

标签: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

标签:kmp

原文地址:http://blog.csdn.net/u013050857/article/details/45503735

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!