#include "bits\stdc++.h"
using namespace std;
void get_next(const char *s,int *next){
int i=0,j=-1;
int len=strlen(s);
next[0]=-1;
while(i<len){
if(j==-1||s[i]==s[j]){
//未优化next
// next[i+1]=j+1;
// i++;j++;
//优化后nextval
i++;j++;
if(s[i]!=s[j]){
next[i]=j;
}else{
next[i]=next[j];
}
}else{
j=next[j];
}
}
}
int find_str(const char *str,const char *target,int *next){
int i=0,j=0;
int len1=strlen(str);
int len2=strlen(target);
while(i<len1&&j<len2){
if(j==-1||str[i]==target[j]){
i++;j++;
}else{
j=next[j];
}
}
if(j!=len2){
return -1;
}else{
return i-j+1;
}
}
int main(void){
int next[1000];
const char *a="ababac";
const char *b="aaaaaababac";
int len=strlen(a);
get_next(a,next);
for(int i=0;i<len;i++){
cout<<next[i]<<" ";
}
cout<<endl;
cout<<find_str(b,a,next);
return 0;
}
KMP next数组计算方法以及KMP匹配算法(包括优化后的nextval)
最新推荐文章于 2024-10-06 14:10:45 发布