算法导论—KMP

华电北风吹
日期:2016/2/24

KMP精要:
KMP在进行朴素匹配时,如果发现不匹配字符时,通过对已经匹配的那部分字符串来确定模式偏移距离和下次开始匹配位置。KMP对模式进行预处理时间复杂度O(m),匹配时间复杂度O(n),总的KMP时间复杂度为O(m+n)。

参考资料:
关于kmp原理讲解具体可以参考字符串匹配的KMP算法— 阮一峰

参考代码:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Solution
{
public:
    vector<int> nextVector(string pattern)
    {
        int m = pattern.size();
        vector<int> result(m);
        for (int i = 1; i < m; i++)
        {
            int j = result[i - 1];
            while (j&&pattern[i] != pattern[j])
                j = result[j - 1];
            result[i] = pattern[i] == pattern[j] ? j + 1 : 0;
        }
        return result;
    }
    vector<int> KMP(string str, string pattern)
    {
        int n = str.size(), m = pattern.size();
        vector<int> arr = nextVector(pattern);
        vector<int> result;
        int p = 0;
        for (int i = 0; i < n; i++)
        {
            while (p>0 && pattern[p] != str[i])
                p = arr[p - 1];
            if (str[i] == pattern[p])
                p++;
            if (p == m)
                result.push_back(i - p + 1);
        }
        return result;
    }
};

int main(int argc, _TCHAR* argv[])
{
    Solution s;
    string str = "BBC ABCDAB ABCDABCDABDE";
    string patter = "ABCDABD";
    vector<int> v = s.KMP(str, patter);
    for (auto i : v)
        cout << i << endl;

    getchar();
    return 0;
}

你可能感兴趣的:(算法导论—KMP)