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算法模板的主要内容,如果未能解决你的问题,请参考以下文章