Kmp 模板(邝斌 - 人一我百,人百我万)

1,求第一次匹配的位置

void getNext(int m){
    int i=0,j=-1;
    Next[0]=-1;


    while(i < m){
        if(j == -1 || p[i] == p[j])
            Next[++i] = ++j;
        else
            j=Next[j];
    }
}


bool Kmp(int n,int m){
    getNext(m);
    int i = 0,j = 0;
    while(i < n && j < m){
        if(j == -1 || s[i] == p[j]){
            i++;
            j++;
        }
        else
            j=Next[j];
    }
    if(j >= m)  return true;
    else
        return false;
}


2,求主串中模式串匹配的次数

void getNext(int m){
    Next[0]=-1;
    int i = 0,j = -1;
    while(i < m){
        if(j == -1 || p[i] == p[j])
            Next[++i]=++j;
        else
            j = Next[j];
    }
}
int Kmp(int n,int m){
    getNext(m);
    int i = 0,j = 0;
    int ans = 0;
    while(i < n && j < m){
        if(j == -1 || s[i] == p[j]){
            i++;
            j++;
        }
        else
            j = Next[j];
        if(j >= m){
            ans++;
            j = Next[j];
        }
    }
    return ans;
}


3,求 Next 数组的时候

Next[++i]=++j;
总是会忘了 ++i,和++j。一定注意别忘了 ++。

posted on 2016-05-18 22:20  Jstyle  阅读(184)  评论(0编辑  收藏  举报

导航