字符串之KMP详解

昨晚梳理了一下KMP的过程,感觉印象深刻了不少,在此写下博客加深印象,同时也希望能和大家交流。

KMP这个名字来源于其三个创始人名字首字母,主要用于解决字符串的匹配问题。

字符串的匹配问题:假设有两个字符串S和T,问串T是否出现在串S中/串T在串S中出现了多少次。(假设串S的长度为n,串T的长度为m)

常规思路:

按照我们正常的想法,肯定是用T跟S的每一位一一匹配,一旦遇到不能匹配的时候,就将正在匹配的起始位置右移一个,即起始位置+1,然后依然与T进行一一匹配,直到匹配成功为止,否则T不出现在S中。

这样思路的时间复杂度为O(n*m),那么有没有好一点的方法来解决这个问题呢,嘤,当然有,就是众所周知的KMP了。

KMP算法思路:

首先我们设S串(称为主串)为S1S2S3......Sn(S0不存放字符)

设T串(模式串)为T1T2T3......Tm

假设我们对两个串进行匹配,匹配到如下过程:


Si和Tj不匹配了,按照上面的常规思路就是将下边(i-j+1)加上一,再一一匹配了,但是我们的KMP不这样

举个栗子,假设主串为abacabadaea,模式串为abad,我们先模拟一

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值