1. class KMP{
    2. private:
    3. string pat;
    4. vector<vector<int>> dp;
    5. public:
    6. KMP(string pat){
    7. int M = pat.length();
    8. this->pat = pat;
    9. dp = vector<vector<int>>(M, vector<int>(256, 0));
    10. //base case
    11. dp[0][pat[0]] = 1;
    12. //影子状态初始化为0
    13. int X = 0;
    14. //从状态1开始
    15. for (int j = 1; j < M; ++j){
    16. for (int c = 0; c < 256; ++c){
    17. if (pat[j] == c)dp[j][c] = j + 1;
    18. else dp[j][c] = dp[X][c];
    19. }
    20. //更新影子状态
    21. X = dp[X][pat[j]];
    22. }
    23. }
    24. int search(string txt){
    25. int M = pat.length();
    26. int N = txt.length();
    27. // pat 的初始态为 0
    28. int j = 0;
    29. for (int i = 0; i < N; i++) {
    30. // 计算 pat 的下一个状态
    31. j = dp[j][txt[i]];
    32. // 到达终止态,返回结果
    33. if (j == M) return i - M + 1;
    34. }
    35. // 没到达终止态,匹配失败
    36. return -1;
    37. }
    38. };