无标题文章

include<iostream>

include <cstring>

include <algorithm>

include <cmath>

include <queue>

include <stack>

using namespace std;
//next[i]存的是从0到I的字符串的前后相等的最大长度。
void buildNext(string s,int next[]){
next[0]=-1;
for (int i=1; i<=s.length()-1; i++) {
string ss=s.substr(0,i+1);//获取从0开始到I的字符串。
int len=i+1-1;//从最大的长度开始检验。
while (len>=1) {
string s1=ss.substr(i+1-len,len);
string s2=ss.substr(0,len);
if(s1==s2)break;
len--;
}
next[i]=len;
}
}
int KMP(string s,string p,int next[]){
for (int i=0; i<s.length(); ) {
int a=i;
for (int j=0; j<p.length(); ) {
if(s[a]==p[j]){
a++;
j++;
if(j==p.length())return i;
}
else{
if(j>0){
int iNext=j-next[j-1];//移动位数=已匹配的字符数-前后相等的长度;
i+=iNext;
break;
}else{
i++;
break;
}
}
}
}
return -1;
}
int main(){
string s,p;
getline(cin,s);
getline(cin,p);
cout<<s<<endl<<p<<endl;
int next[100];
buildNext(p, next);
cout<<KMP(s, p, next);
return 0;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容