清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
KMP算法的重点是寻找next数组,程序如下:
#include <iostream> #include <string> #include <vector> using namespace std; class Solution { public: int KMPSearch(string text, string pattern, vector<int> next) { int i = 0; int j = 0; while (i<text.size() && j<int(pattern.size())) { if (j == -1 || pattern[j] == text[i]) { i++; j++; } else { j = next[j]; } } if ( j == pattern.size()) return i - j; else return -1; } void GetNext(string pattern, vector<int>& next) { next[0] = -1; int start = -1; int end = 0; while (end < pattern.size() - 1) { if (start == -1 || pattern[start] == pattern[end]) { ++start; ++end; next[end] = start; } else { start = next[start]; } } } }; int main() { Solution sol; vector<int> next(7, 0); string text("AAAAABBC ABCDAB ABCDABBDCDABDE ABCDABD"); string pattern("ABCDABD"); sol.GetNext(pattern, next); cout << sol.KMPSearch(text, pattern, next) << endl; }