kmp匹配算法

(本文整理自讲义及自己的笔记,如有错误之处请指出)

注意:在本文中我们将使用始于零的数组来表示我们的字符串。所以在下面例子中,我们用S[2]来表示字符串S中的第三个字符。这种表示遵从C++语言的语法。

KMP算法可在一个主“文本字符串”S内查找一个“词”W的出现位置。此算法通过运用对这个词在不匹配时本身就包含足够的信息来确定下一个匹配将在哪里开始的发现,从而避免重新检查先前匹配的字符。
——摘自wikipedia

先来看看我们的问题:给出长度为 n 的字符串 S 和长度为 m 的字符串 T ,问在字符串 S 中可以包含最多多少个字符串 T

容易想到暴力的做法:枚举 T S 中的起始位置 i ,不断比较 Si..i+m1 是否等于 T
这种暴力做法的时间复杂度是多少呢?

我们知道,起始位置 i (nm+1) 种可能,每次要比较 m 个字符,故时间复杂度为 Θ(nm)

我们可以分析一下暴力做法的效率为什么低:

S = aaaaaaaaaaaaaaaaaaab
T = aaaaab

这时候暴力做法没注意到 T1..4 T2..5

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值