#include<iostream>
#include<string.h>
using namespace std;
int *COMPUTE_PREFIX_FUNCTION(string P) {
int m=P.size();
int *A=new int[m+1];
A[1]=0;
int k=0;
for(int q=2;q<=m;q++) {
while(k>0 && P[k]!=P[q-1]) {
k=A[k];
}
if(P[k]==P[q-1]) {
k++;
A[q]=k;
}
}
return A;
}
void KMP_MATCHER(string T,string P) {
int n=T.size();
int m=P.size();
int *A=COMPUTE_PREFIX_FUNCTION(P);
int q=0;
for(int i=1;i<=n;i++) {
while(q>0 && P[q]!=T[i-1]) {
q=A[q];
}
if(P[q]==T[i-1]) {
q++;
}
if(q==m) {
cout<<"Pattern occurs with shift "<<i-m+1<<endl;
q=A[q];
}
}
}
int main() {
string P,T;
cout<<"请输入父字符串:";
cin>>T;
cout<<"请输入父字符串:";
cin>>P;
KMP_MATCHER(T,P);
return 0;
}
/*
abctergytrabcgregabcdsfabcf
abc
*/
算法导论KMP匹配字符串
最新推荐文章于 2021-03-30 20:37:33 发布