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;
}
posted @ 2019-12-07 12:47  zzt1208  阅读(146)  评论(0)    收藏  举报