KMP算法
原理:
- 将子串创建一个Next数组储存前缀后缀相同数量
- 将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;//匹配失败
}

浙公网安备 33010602011771号