题目
思路
参考大佬视频:
kmp理论视频:https://www.bilibili.com/video/BV1PD4y1o7nd?from=search&seid=11743416992824692144
kmp,next数组代码视频:https://www.bilibili.com/video/BV1M5411j7Xx?spm_id_from=333.788.b_636f6d6d656e74.13
代码
#include<iostream>
#include<cstring>
using namespace std;
const int N =100005;
string S,P;
int ne[N];//存储最长相等前后缀
void getNext(string P){
int j=0;//j是p字符串的前缀末尾,i是p字符串的后缀末尾
ne[0]=0;
for(int i=1;i<P.size();i++){
while(j>0 && P[i]!=P[j]){ //j要保证大于0,因为下面有取j-1作为数组下表的操作,如果不相等,那么
j=ne[j-1]; //j要返回到next[j-1]的位置
}
if(P[j]==P[i]){ //相等,那么j++;
j++;
}
ne[i]=j;
}
}
int main(){
int n,m;
cin>>n>>P>>m>>S;
getNext(P);
if(S.size()==0){//S为0,直接返回-1;
cout<<-1<<endl;
return;
}
int j=0;
for(int i=0;i<S.size();i++){
while(j>0 && S[i]!=P[j]){ //不等的时候,j回到ne[j-1]的位置
j=ne[j-1];
}
if(S[i]==P[j]){
j++;
}
if(j==P.size()){
cout<<i-P.size()+1<<" ";
}
}
return 0;
}