### 实现 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]; } } } ```