KMP模板

来源:互联网 发布:沸点网络电视官网 编辑:程序博客网 时间:2024/05/21 00:00

思路来自Matrix67:http://www.matrix67.com/blog/archives/115

void pre(string str){    int j=-1;    next[0]=-1;    for(int i=1;i<str.size();i++){        while(j>=0&&str[j+1]!=str[i]) j=next[j];        if(str[j+1]==str[i]) j++;        next[i]=j;    }}int kmp(string str1,string str2){    pre(str2);    int ans=0;    int j=-1;    for(int i=0;i<str1.size();i++){        while(j>=0&&str2[j+1]!=str1[i]) j=next[j];        if(str2[j+1]==str1[i]) j++;        if(j==str2.size()-1){//找到一次            ans++;            j=next[j];//继续向后找        }    }    return ans;}

void get_next(){    int k=-1,j=0;    next[0]=-1;    while(j<pl)    {        if(k==-1||p[j]==p[k])        {            j++;k++;            next[j]=k;        }        else        k=next[k];    }}int KMP(){    int i=0,j=0;    get_next();    while(j<pl&&i<sl)    {            if(j==-1||s[i]==p[j])            {                i++;j++;            }            else j=next[j];            if(j==pl)            {                sum++;j=next[j];            }    }    return sum;}



0 0
原创粉丝点击