讲解视频推荐:
帮你把KMP算法学个通透!(求next数组代码篇)_哔哩哔哩_bilibili
以上两个视频第一个主要是讲解思路,第二个阐述了代码实现以及运行过程,讲解很清晰
代码:
//KMP算法
#include <bits/stdc++.h>
using namespace std;
void getnext(int* next,string s){
//初始化 处理相等的情况
//不想等的情况 更新数组的值
int i,j=0;//j代表前缀末尾 i代表后缀的末尾
next[0]=0;//初始回退到0
for(i=1;i<s.size();i++){
while(j>0&&s[i]!=s[j])j=next[j-1];//回退 到上一位
if(s[i]==s[j])j++;
next[i]=j;
}
return;
}
int kmp(string text,string s,int* next){
int n=text.size();
int m=s.size();
getnext(next,s);//预处理next数组
int i,q;
for(i=0,q=0;i<n;i++){
while(q>0&&s[q]!=text[i])q=next[q-1];//匹配不到
if(s[q]==text[i])q++;
if(q==m){
//匹配成功 返回上一位
return i-q+1;
}
}
//匹配失败返回-1
return -1;
}
int main(){
string text="ABAABAABBABAAABAABBABAAB";
string temp="AABBABAAB";
int len=temp.size();
int arr[len+1];
getnext(arr,temp);
cout<<kmp(text,temp,arr)<<endl;
return 0;
}