#include<cstdio>//下标从0开始的写法!!天勤书上是下标从1开始的!!!
#include<cstring>
#include<iostream>
using namespace std;
struct str{
string s;
int next[50]={0};
};
string zhu="555asssada555dsf";
void getnext(str& sub){
int i=0,j=-1;//参数加一
sub.next[0]=-1;//参数加一
while(i<sub.s.size()-1){//加一
if(j==-1||sub.s[i]==sub.s[j]){//参数加一和天勤一样!!
++j;
++i;
sub.next[i]=j;
}//把判断是否对称作为核心代码!!
else
j=sub.next[j];
}
}
int kmp(str sub){
int i=0,j=0;
// cout<<zhu<<" "<<sub.s<<endl;
while(i<zhu.size()&&j<sub.s.size()){//i==zhu.size()表示主串搜索完毕!
if(j==0||zhu[i]==sub.s[j]){//j==sub.s.size()表示匹配成功!
i++;
j++;
}else{
j=sub.next[j];
}
}
if(j==sub.s.size())
return (i-sub.s.size());
else
return -1;
}
int main(){
str sub;
cin>>sub.s;
getnext(sub);
for(int i=0;i<sub.s.size();i++){
printf("%d ",sub.next[i]);
}
printf("匹配到了!在第%d个字符!",kmp(sub));
return 0;
}
next函数
最新推荐文章于 2024-02-20 18:30:08 发布