KMP算法

原理

  1. 将子串创建一个Next数组储存前缀后缀相同数量
  2. 将Next数组和母串进行匹配

代码实现

void Next_pre(string p,vector<int>&Next)
{
	for(int i=1,j=0;i<(int)p.size();i++)
	{
		while(j&&p[i]!=p[j])j=Next[j-1];//如果不相同查找前一个字符的Next数组指向位置
		if(p[i]==p[j])j++;//匹配成功——>Next数组元素+1
		Next[i]=j;
	}
}
int kmp_search(string p,string s,vector&Next,int begin)//p是子串,s是母串
{
	for(int i=begin,j=0;i<(int)p.size();i++)
	{
		while(j&&s[i]!=p[j])j=Next[j-1];//如果不同还是往前一个字符的Next数组跳
		if(s[i]==p[j])j++;
		if(j==(int)p.length())return i-p.length()+1;//匹配成功——>返回开始下标
	}
	return -1;//匹配失败
}
posted @ 2022-01-18 15:03  snaliuu  阅读(51)  评论(1)    收藏  举报