(模板) KMP

会有一股神秘感。 提交于 2019-12-01 19:25:33

—————————————————————————————————————————————————— —————————————————————前排护眼——————————————————————— ——————————————————————————————————————————————————

 

//文本串和模式串
string str,pat;

 

//next[i]表示模式串前i个字符组成的串其前缀后缀相通的最长长度
//也是在i出匹配失败时该跳转的位置
int next[10002];


//得到next数组
void getnext(){
    int i=0,j=-1;
    next[0]=-1;
    while(i<pat.size()){
        if(j==-1||pat[i]==pat[j]){
            next[++i]=++j;
        }
        else j=next[j];
    }
}


//返回文本串中模式串出现的次数
int kmp(){
    int i=0,j=0,len1=str.size(),len2=pat.size();
    int ans=0;
    while(i<len1){
        if(j==-1||str[i]==pat[j]){
            i++;
            j++;
        }
        else j=next[j];
        if(j==len2)ans++;
    }
    return ans;
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!