#include <iostream>
#include <string>
using namespace std;
void print(const int* p, const int &n){
cout << "前缀数组:";
for(int i = 0; i < n - 1; i++){
cout << *(p++) << " ";
}
cout << *p << endl;
}
int *prefix(const string& P){
int m = P.size();
int *pi = new int[m];
int j = -1;
pi[0] = -1;
for(int i = 1; i < m; i++){
while(j >= 0 && P[i] != P[j+1])
j = pi[j];
if(P[i] == P[j+1])
++j;
pi[i] = j;
}
return pi;
}
void kmp(const string& T,const string& P){
int n = T.size();
int m = P.size();
int *pi = prefix(P);
print(pi,m);
int j = -1;
for(int i = 0; i < n; i++){
while(j >= 0 && T[i] != P[j+1])
j = pi[j];
if(T[i] == P[j+1])
++j;
if(j == m - 1){
cout << "匹配位置:" << i - m + 1 << "," << i << endl;
j = pi[j];
}
}
}
int main(){
//string P("ababaca");
string P("aba");
string T("bacbababaababacaababaca");
kmp(T,P);
}
KMP C++
最新推荐文章于 2022-12-04 23:29:43 发布