曾经学习过KMP算法,只依稀记得这是一种字符串的匹配算法,然而当时太菜,学得并不透彻。如今到了复习字符串的时候,就写一篇关于KMP的博客,给自己一个更深更透彻的理解。
问题背景
给定一个文本串S1,一个模式串S2(为什么叫这俩名字我也不知道),查找S2在S1中的对应位置。
暴力匹配
根据描述,很容易想到一个 n 2 n^2 n2的暴力:即 i i i表示S1匹配到 i i i号位置, j j j表示S2匹配到 j j j位置。如果S1[i]==S2[j], i ++, j ++, 若j = Len(S2) (根据下标使用,也可能是 − 1 -1 −1),则匹配成功,反之 i = i − ( j − 1 ) , j = 0 i = i - (j - 1),j = 0 i=i−(j−1),j=0重新进行匹配。
根据这个思路,得到下列的代码:
string S1, S2;
cin >> S1 >> S2;
int Len1 = S1.length(), Len2 = S2.length();
LL i = 0, j = 0;
while (i < Len1)
{
if (S1[i] == S2[j])
{
i ++, j ++;
if (j == Len2 - 1)
PP[++ tot] = i - j, i -= (j - 1), j = 0;
}
else i -= (j - 1), j = 0;
}
KMP
先转个博客