理论知识参考来自:
具体代码可以参考:
#include<iostream>
#include<vector>
using namespace std;
int BF_Search(string& txt, string &pat) {
int M = txt.length();
int N = pat.length();
for (int i = 0; i <= M - N; i++) {
int j;
for (j = 0; j < N; j++) {
if (pat[j] != txt[i + j])
break;
}
if (j == N)
return i;
}
return -1;
}
class KMP_algorithm
{
private:
vector<vector<int>> dp;
string pat;
void DP_Calculate() {
int X = 0;
int size = this->pat.length();
dp[0][pat[0]] = 1;
for (int j = 1; j < size; j++) {
for (int c = 0; c < 256; c++)
{
if (pat[j] == c)
dp[j][c] = j + 1;
else
dp[j][c] = dp[X][c];
}
X = dp[X][pat[j]];
}
}
public:
KMP_algorithm(string pat) {
this->pat = pat;
int row = pat.length();
vector<int> temp(256);
dp.resize(row, temp);
this->DP_Calculate();
}
int KMP_Searh(string txt) {
int M = txt.length();
int N = pat.length();
int j = 0;
for (int i = 0; i < M; i++) {
j = dp[j][txt[i]];
if (j == N)
return i - N + 1;
}
return -1;
}
};
int main() {
string txt = "ababc";
string tex = "abcabc";
string pat = "abc";
KMP_algorithm str(pat);
cout<<str.KMP_Searh(txt)<<endl;//2
cout<<str.KMP_Searh(tex) << endl;//0
system("pause");
return 0;
}