KMP算法总结

大佬的详细解析

*自己的总结

 定义,模式串为s,匹配串为t,s的指针为i,t的指针为j。
 KMP本质上就是利用next数组中预处理出来的信息(即最长相等前后缀,next[j]表示t1~tj-1的最长相等前后缀长度,同时是如果在tj处匹配失败后子串的指针j应该指向的位置),来加快字符串的匹配。
 例如,next[j]=3时,若当前t的第j位与s的第i位匹配失败,那么根据next数组的定义,t0、t1、t2等于tj-3、tj-2、tj-1,而tj-3、tj-2、tj-1又是等于si-3、si-2、si-1的(因为t的前j-1位必然匹配成功,否则指针不可能指向第j位),因为这些位都相等,因此没有必要从头开始匹配,可直接从tnext[i],即t3开始再次与si匹配。
 而next数组的求法本身就是一次KMP算法,带着这个思想看大佬图解即可。

百科上扣的总结

KMP中我们用两个指针i和j分别表示,A[i-j+ 1…i]与B[1…j]完全相等。也就是说,i是不断增加的,随着i的增加j相应地变化,且j满足以A[i]结尾的长度为j的字符串正好匹配B串的前 j个字符,当A[i+1]≠B[j+1],KMP的策略是调整j的位置(减小j值)使得A[i-j+1…i]与B[1…j]保持匹配且新的B[j+1]恰好与A[i+1]匹配,而next函数恰恰记录了这个j应该调整到的位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值