【算法】查找字符串的 KMP 算法

“在一个字符串S中查找一个词W出现的位”是一道常见的面试题。

相对于那些要对树、图进行操作的算法,这个算法要处理的是一维线性的字符序列。看起来似乎简单不少,那么算法难度会更低吗?让我们来看看。

简单直接的字符串查找算法 

算法原理

首先,如果只是笼统地从一个字符串中查找另一个字符串,有一种很直接的方法,那就是:

  • 从 S 的第 1 个字符开始,与 W的每一个字符一一匹配。

    • 如果一致,就继续匹配下一个,如果w的所有字符都匹配上了,则说明已经查找到了W。

    • 如果不一致,则从S的第 2 个字符开始重复整个过程;如果还不行就再从第三个字符开始……总之就是跳回到本次匹配S开始处的下一个字符,然后重新开始整个匹配过程

  • 如果到最后都没有匹配上完整的W,则说明S中根本无法找到 W。

算法流程图

本算法流程图如下:

算法运行示例

按照它进行字符串查找的案例如下:

 

算法性能

这个算法又简单又好操作,唯一的缺点是有点慢。

假设 S 的长度为 n 而 W的长度为 m,则这个直接算法的时间复杂度是 O(n*m)。

有没有效率更高的,时间复杂度类似 O(n)的算法呢?还真的有,这个算法的名字叫做 KMP算法。

高效率的 KMP 算法

算法历史

K, M, P 这三个字母是本算法的三位发明人名字的缩写,这三位是:Knuth (大名鼎鼎的高德纳),Morris,和 Pratt。三人于1977年联合发表了该算法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶锦鲤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值