### 实现 KMP 算法,找出所有符合的偏移值。
### 思路:这已经不是某个题目了,这个算法会就是会,不会就不会,本人能力有限,无法完全讲清楚这个算法,请参考《算法导论》第三版第 32 章,这章内容会让你对字符串匹配算法有个清楚的了解,但也只是挑了一些算法讲,更多内容见[链接](http://www-igm.univ-mlv.fr/~lecroq/string/)。
下面是按照《算法导论》实现的代码
```
void computePrefixFunction(const string &pattern, vector<int> &pai)
{
int m = pattern.length();
pai.clear();
pai[0] = -1;
int k = -1;
for (int q = 1; q < m; ++q) {
while (k > -1 && pattern[k + 1] != pattern[q])
k = pai[k];
if (pattern[k + 1] == pattern[q])
k = k + 1;
pai[q] = k;
}
}
void KMPMatcher(const string &text, const string &pattern)
{
int n = text.length(), m = pattern.length();
vector<int> pai(m);
computePrefixFunction(pattern, pai);
int q = -1;
for (int i = 0; i < n; ++i) {
while (q > -1 && pattern[q + 1] != text[i])
q = pai[q];
if (pattern[q + 1] == text[i])
q = q + 1;
if (q == m - 1) {
cout << "Pattern occurs with shift" << (i - m + 1) << endl;
q = pai[q];
}
}
}
```