字符串匹配算法之KMP

字符串匹配算法是用于在一个文本串中查找一个模式串的出现位置的算法。其中,一个经典的字符串匹配算法是KMP算法(Knuth-Morris-Pratt算法)。

KMP算法

KMP算法是一种高效的字符串匹配算法,它通过利用模式串的信息避免无效的字符比较,从而提高了匹配的效率。

下面是一个简单的KMP算法的C++实现:

#include 
#include 

std::vector<int> buildPrefixArray(const std::string& pattern) {
    int m = pattern.size();
    std::vector<int> prefix(m, 0);
    int j = 0;

    for (int i = 1; i < m; ++i) {
        while (j > 0 && pattern[i] != pattern[j]) {
            j = prefix[j - 1];
        }

        if (pattern[i] == pattern[j]) {
            prefix[i] = ++j;
        }
    }

    return prefix;
}

std::vector<int> kmpSearch(const std::string& text, const std::string& pattern) {
    int n = text.size();
    int m = pattern.size();
    std::vector<int> result;

    std::vector<int> prefix = buildPrefixArray(pattern);

    int i = 0, j = 0;
    while (i < n) {
        if (pattern[j] == text[i]) {
            ++i;
            ++j;
        }

        if (j == m) {
            // 找到匹配
            result.push_back(i - j);
            j = prefix[j - 1];
        } else if (i < n && pattern[j] != text[i]) {
            if (j != 0) {
                j = prefix[j - 1];
            } else {
                ++i;
            }
        }
    }

    return result;
}

int main() {
    std::string text = "ABABDABACDABABCABAB";
    std::string pattern = "ABABCABAB";
    
    std::vector<int> matches = kmpSearch(text, pattern);

    if (!matches.empty()) {
        std::cout << "Pattern found at positions: ";
        for (int pos : matches) {
            std::cout << pos << " ";
        }
        std::cout << std::endl;
    } else {
        std::cout << "Pattern not found in the text." << std::endl;
    }

    return 0;
}
逐行解释:
  1. buildPrefixArray 函数:该函数用于构建模式串的前缀数组(也称为部分匹配表)。前缀数组的每个元素表示在当前位置之前的子串中,有多长的前缀和后缀相等。

  2. kmpSearch 函数:该函数是KMP算法的主要逻辑。它使用了前缀数组,通过对模式串和文本串的比较,尽量减少无效的字符比较。

  3. main 函数:在主函数中,我们定义了一个文本串 text 和一个模式串 pattern,然后调用 kmpSearch 函数进行字符串匹配。最后,输出模式串在文本串中的出现位置。

KMP算法的时间复杂度为 O(n + m),其中 n 是文本串的长度,m 是模式串的长度。这使得KMP算法在大规模文本中进行高效的字符串匹配。

你可能感兴趣的:(算法,c++,开发语言)