#include<bits/stdc++.h>
using namespace std;
void Next(string t,int next[]){
int i=0,j=-1;
next[0]=-1;
while(i<t.length()-1){
if(j==-1||t[i]==t[j]){ //第一位不等或者s[i]和t[i]相等
i++;j++; //匹配下一位
next[i]=j;
}else{
j=next[j];
}
}
}
int KMP(string s,string t,int next[]){
int i=0; //模式串
int j=0; //匹配串
while(i<s.length() && j<t.length()){
if(j==-1 || s[i]==t[j]){ //第一位不等或者s[i]和t[i]相等
i++;
j++;
}else{ //模式串回溯到匹配位
j=next[j];
}
}
if(j==t.length())
return i-j; //返回匹配位置
else return -1;
}
int main(){
string s="abaabaabcabaabc";
string t="abaabc";
int next[100];
memset(next,0,sizeof(int));
Next(t,next);
for(int i=0;i<6;i++) cout<<next[i];
cout<<endl<<KMP(s,t,next);
return 0;
}
KMP模式匹配算法代码实现
最新推荐文章于 2022-06-01 15:37:50 发布