KMP-简单易懂

解决问题
str1中是否有某个子串等于str2,有则返回在str1中得到起始位置。

举例:abcabck 和 abcabct 此时返回-1
abcabcabct 和 abcabct 此时返回3

常规思路
用str2去比较str1从0开始的每一位,比较结束若有str2返回此时比较的起始位置,否则返回-1

KMP算法思路
先计算出str2的nexts数组(起始位-1,计算出其他位置最长前缀和最长后缀到的匹配【要求前缀不包含最后一位,后缀不包含起始位】)
举例:str2–“ababat” 则对应得到nexts={-1,0,0,1,2,3}
nexts计算:
当前位置为i, 比较后缀开始位置pos - 1和前缀开始位置cn,相等时较前缀计数+1;
不等时,前缀位置往前跳到cn = next[cn];(cn > 0)
否则,当前位置为0
然后str1和str2进行比较:
index1指示str1当前位置,index2指示str2当前位置
1.str1开头不等于str2起始位置,str1当前位置index1后移一位
2.相等时index1++,index2++
3.经历2后不等,则从str2的nexts[index2]与str1的index1开始比较,前面部分肯定相等无需再比较
4.比较完后返回index1 - index2

代码见
https://github.com/liuzhuguan/Algorithm2/tree/master/算法进阶/进阶1/src

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值