http://jakeboxer.com/blog/2009/12/13/the-knuth-morris-pratt-algorithm-in-my-own-words/
1.partial_match_table的建立
2.查找
#include <iostream>
#include <string>
#include <vector>
#include <assert.h>
using namespace std;
void partial_match_table(string& input, vector<int>& partial_mt)
{
assert(input.size() != 0);
for (int i = 0; i < input.size(); i++) {
int com = 0;
for (int j = 1; j <= i; j++) {
string prefix = input.substr(0, j);
string postfix = input.substr(i - j + 1, j);
if (!prefix.compare(postfix)) {
com = j;
}
}
partial_mt.push_back(com);
}
}
void KMP(string& test, string& match, vector<int>& partial_mt)
{
int i = 0;
int j = 0;
while (i < test.size()) {
while (j < match.size()) {
if (test.at(i) == match.at(j)) {
i++;
j++;
}
else if (j == 0){
i ++;
}
else {
i += (j - partial_mt.at(j-1));
j = 0;
}
}
cout << i-j+1 << endl;
break;
}
}
int main()
{
vector<int> res;
string test = "ABCDABD";
string match = "BBC ABCDAB ABCDABCDABDE";
partial_match_table(test, res);
KMP(match, test, res);
system("pause");
return 0;
}