#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void built_pai(char P[], int pai[], int m) {
int k{};
pai[0] = 0;
for (int q = 1; q < m; ++q) {
while (k > 0 && P[k] != P[q]) {
k = pai[k];
}
if (P[k] == P[q]) {
k++;
}
pai[q] = k;
}
}
void KMP(char P[], char T[], int pai[], int m, int n) {
built_pai(P, pai, m);
int q{};
for (int i = 0; i < n; ++i) {
while (q > 0 && P[q] != T[i]) {
q = pai[q - 1];
}
if (P[q] == T[i]) {
q++;
}
if (q == m) {
cout << "Pattern occurs with shift " << i - m << endl;
q = pai[q - 1];
}
}
}
int main(int argc, char* argv[]) {
vector<char> v{};
char element{};
cout << "please enter the pattern (end by '0') : " << endl;
while (cin >> element) {
if (element != '0') {
v.push_back(element);
}
else {
break;
}
}
int m = v.size();
char* P = new char[m] {};
int index{};
for_each(v.begin(), v.end(), [=](char x)mutable{ P[index++] = x; });
v.clear();
index = 0;
cout << "please enter the text (end by '0') : " << endl;
while (cin >> element) {
if (element != '0') {
v.push_back(element);
}
else {
break;
}
}
int n = v.size();
char* T = new char[n] {};
for_each(v.begin(), v.end(), [=](char x)mutable{ T[index++] = x; });
int* pai = new int[m] {};
KMP(P, T, pai, m, n);
delete[]P;
delete[]T;
delete[]pai;
return 0;
}
算法导论-第32章-字符串匹配:Knuth-Morris-Pratt(KMP)算法C++实现
最新推荐文章于 2019-05-14 11:05:07 发布