KMP算法模板

Posted juruo-zzt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KMP算法模板相关的知识,希望对你有一定的参考价值。

1.啥是KMP算法?

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。(源自百度百科)


2.代码

#include<bits/stdc++.h>
using namespace std;
int nxt[1005];
void GetNext(string p)
{
    int pLen=p.length();
    nxt[0]=-1;
    int k=-1;
    int j=0;
    while (j<pLen-1)
    {
        if(k==-1||p[j]==p[k]) 
        {
            ++k;
            ++j;
            nxt[j] = k;
        }
        else k=nxt[k];
    }
}
int KMP1(string s,string p)//返回位置 
{
    int i=0,j=0,sLen=s.length(),pLen=p.length();
    GetNext(p);
    while(i<sLen&&j<pLen)
    {
        if(j==-1||s[i]==p[j])
        {
            i++;
            j++;
        }
        else j=nxt[j];
    }
    if(j==pLen) return i-j;
    else return -1;
}
int KMP2(string s,string p)//返回数量 
{
    int i=0,j=0,sLen=s.length(),pLen=p.length(),ans=0;
    GetNext(p);
    while(i<sLen&&j<pLen)
    {
        if(j==-1||s[i]==p[j])
        {
            i++;
            j++;
        }
        else j=nxt[j];
        if(j==pLen)
        {
            ans++;
            j=nxt[j-1];
            i--;
        }
    }
    return ans;
}
int main()
{
    string p,s;//p为文本串,s为模式串 
    cin>>p>>s;
    cout<<KMP1(p,s)<<endl<<KMP2(p,s);
    return 0;
}

以上是关于KMP算法模板的主要内容,如果未能解决你的问题,请参考以下文章

kmp算法模板及理解

模板KMP算法

[模板]KMP算法

扩展KMP模板

KMP 算法

KMP算法模板