#include <iostream>
#include <string>
#include <vector>
using namespace std;
void COMPUTE_PREIFX_FUNCTION(string P,vector<int>& pi);
void KMP_MATCHER(string &T,string &P);
void main()
{
string T="BBC ABCDAB ABCDABCDABDEFABCDABDff";
string P="ABCDABD";
KMP_MATCHER(T,P);
}
void COMPUTE_PREIFX_FUNCTION(string P,vector<int>& pi)
{
int m=P.size();
pi[0]=0;
pi[1]=0;
int k=0;
for (int q=2;q<m;q++)
{
while (k>0&&P[k+1]!=P[q])
{
k=pi[k];
}
if (P[k+1]==P[q])
{
k=k+1;
}
pi[q]=k;
}
}
void KMP_MATCHER(string &T,string &P)
{
T="%"+T;
P="*"+P;
int m=P.size();
vector<int> pi(m);
int n=T.size();
COMPUTE_PREIFX_FUNCTION(P,pi);
int q=0;
int i;
for (i=1;i<n;i++)
{
while (q>0&&P[q+1]!=T[i])
{
q=pi[q];
}
if (P[q+1]==T[i])
{
q=q+1;
}
if (q==m-1)
{
cout<<"pattern occurs with shift "<<i-q<<endl;
q=pi[q];
}
}
}
05-31
05-31
05-31
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交