算法导论—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算法
    原文地址: https://blog.csdn.net/zhangzhengyi03539/article/details/50734096
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞