基于上一篇博客求next表(KMP的next表求法-优快云博客)
我完成了查找子串在主串中的位置的完整程序:
(当然,当有多个相同的字串出现,只返回距离主串的头最近的那个)
#include<iostream>
using namespace std;
void get_next_biao(int next[],string s){ //得到next表
next[0]=-1;
next[1]=0;
for(int i=2;i<s.size();i++){ //制作next表,第三位开始
int j=0;
while(s[i-1]!=s[j]){j++;} //判断后缀最后一个字符是否存在于前缀中
if(j==i-1){next[i]=0;} //没有的话,就赋值next为0
else{
int data=0;
for(int k=j;k<=i-2;k++){
if(s[k]==s[i-1]){ //找到所有尾部符合与后缀尾部相等的前缀尾部下标,记作k
int num=-1;
for(int m=0;m<=k;m++){
if(s[i-1-m]==s[k-m]){
num++;
}
}
if(data<=num&&num==k){ //筛选满足等于后缀,且最长的前缀
data=num;
}
}
}
next[i]=data+1; //把重复元素长度记在next表中
}
}
}
int zifu_pipei(string l,string s){
int next[l.size()];
get_next_biao(next,s);
int i=0,j=0;
while(i<l.size()){
if(l[i]==s[j]){
i++;
j++;
}
else{
if(j==0){i++;continue;}
j=next[j];
}
if(j==s.size()){//j越界,则成功遍历完模式串
break;
}
}
if(j==s.size()){ //成功找到
return i-s.size(); //返回对应匹配的子字符的首地址在l中的位置
}
else{
return -1; //返回-1,代表没找到对应的子字符
}
}
int main(){
string l,s;
cin>>l;
cin>>s;
cout<<zifu_pipei(l,s);//输出字符匹配位置
}
运行结果:

541

被折叠的 条评论
为什么被折叠?



