字符串模式匹配--KMP算法

KMP算法的核心,是部分匹配表(Partial Match Table)数组。PMT数组存储字符串前缀集合和后缀集合的交集中最长字串的长度。以ababaca为例,对ababa来说,其字符串前缀集合为{a, ab, aba, abab},后缀集合为{baba, aba, ba, a}。故两集合交集对应的最长字串为aba,其长度为3,其对应的PMT数组中的值即为3。通过利用PMT数组存储重复模式,在字符串模式匹配的过程中可减少重复匹配。

具体代码如下:

int KMP(char* s, char* t)
{
    int len1 = strlen(s), len2 = strlen(t), i = 0, j = 0;  % len1 > len2
    while(i<len1 && j<len2)
    {
        if( j == -1 || s[i] == t[j])
        {
            ++i; ++j;
        }
        else j = pmt[j];
    }
    if(j == len2) return i-j;
    else return -1;
}

void getPMT(char* t, int* next)
{
    int len = strlen(t), i=0, j=-1;
    pmt[0] = -1;  % 为了方便计算设为-1
    while(i<len)
    {
        if(j == -1 || p[i]==p[j])
        {
            ++i; ++j;
            pmt[i] = j;
        }
        else j = pmt[j];
    }
}

参考:如何更好的理解和掌握 KMP 算法? – 海纳的回答 – 知乎
https://www.zhihu.com/question/21923021/answer/281346746

    原文作者:KMP算法
    原文地址: https://blog.csdn.net/qq_24153697/article/details/79131411
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞