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