目前个人觉得最易懂的一个KMP算法讲解

什么是KMP算法?KMP算法是在串的模式匹配中的一个很经典很高效的算法。浙江大学陈越老师在中国MOOC上的讲授的数据结构是目前个人觉得最易懂的一个版本。下面贴上一个链接。

 

 

                            👇

                    中国MOOC浙江大学数据结构时空隧道

 

                                    

 代码:

#include <iostream>
#include <string>

using namespace std;

#define NotFound -1
typedef int Position;

/*动态规划求Match*/
void BuildMatch (string* pattern, int* match)
{
    int i, j;
    int m = pattern->length();            // O(m)
    match[0] = -1;
    for (j = 1; j < m; j++) {            // O(m)
        i = match[j - 1];
        while ((i >= 0) && (pattern->at(i + 1) != pattern->at(j))) {    // 字符串指针不能通过数组下标遍历元素 
            i = match[i];
        }
        if (pattern->at(i + 1) == pattern->at(j)) {
            match[j] = i + 1;
        }
        else {
            match[j] = -1;
        }
    }
}

Position KMP (string* str, string* pattern)
{
    int n = str->length();            // O(n) - 时间复杂度 
    int m = pattern->length();        // O(m)
    int s = 0, p = 0, *match;
    if (n < m) return NotFound;
    match = new int[m];
    BuildMatch(pattern, match);        // Tm = O(m)
    while (s < n && p < m) {
        if (str->at(s) == pattern->at(p)) { 
            s++; p++;
        }
        else if (p > 0) {
            p = match[p - 1] + 1;    
        }
        else {
            s++;
        }
    }
    delete [] match;
    return (p == m) ? (s - m) : NotFound;
}

int main ()
{
    string str1, str2;
    while (getline(cin, str1)) {
        if (str1 == "#") {
            break;
        }
        getline(cin, str2);
        Position p = KMP(&str1, &str2);
        cout << p << endl;
    }
    return 0;
}

 

posted @ 2020-04-10 20:43  MK_筱雨  阅读(404)  评论(0编辑  收藏  举报