KMP。。。

KMP是字符串匹配算法,相对于暴力做法,kmp保持文本串不回溯,而将模式串回溯,文本串只需要依次枚举即可。
kmp的思想是求出模式串每个位置的最长的重复的子串,(最长保证了该算法不会漏掉任何一个可以匹配的情况),并将子串的长度保存到next数组中,如果当前位置匹配失败,指向模式串的指针就会回溯到j=next[j]的位置,尝试去向后寻找可匹配的字符,如果没找到会继续回溯,此时原本的j=next[next[j]],如果还找不到就继续,直到找到或者j=0为止。
例如模式串abcdabfabg 这个串里共有三个ab,假设此时j在第二个ab的后面,也就是f的位置,而此时模式串枚举到了第i个位置,(i在第三个ab后面的g处,这里只是举例,实际上不会出现),此时s[i]!=s[j],所以让j=next[j],所以j会到第一个ab的后面,也就是c的位置,继续比较s[i]与s[j],此时还不对,j=next[j],此时j就到了0,这就意味着从头开始比,就不会继续让j=next[j]了。
模版如下:

// s[]是长文本,p[]是模式串,n是s的长度,m是p的长度
求模式串的Next数组:
for (int i = 2, j = 0; i <= m; i ++ )
{
    while (j && p[i] != p[j + 1]) j = ne[j];
    if (p[i] == p[j + 1]) j ++ ;
    ne[i] = j;
}

// 匹配
for (int i = 1, j = 0; i <= n; i ++ )
{
    while (j && s[i] != p[j + 1]) j = ne[j];
    if (s[i] == p[j + 1]) j ++ ;
    if (j == m)
    {
        j = ne[j];
        // 匹配成功后的逻辑
    }
}

作者:yxc
链接:https://www.acwing.com/blog/content/404/

这里让下标都是从1开始,方便写代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值