码迷,mamicode.com
首页 > 编程语言 > 详细

KMP算法模板

时间:2019-12-07 14:45:32      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:from   利用   href   space   ret   ext   复杂度   时间   代码   

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算法模板

标签:from   利用   href   space   ret   ext   复杂度   时间   代码   

原文地址:https://www.cnblogs.com/juruo-zzt/p/12001356.html

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