博客
关于我
算法数据结构 | 只要30行代码,实现快速匹配字符串的KMP算法
阅读量:497 次
发布时间:2019-03-06

本文共 1462 字,大约阅读时间需要 4 分钟。

今天,我们来聊一个经典的字符串匹配算法——KMP算法。这不是视频播放器,也不是看毛片的软件,而是由Knuth、Morris、Pratt这三位大牛发明的。KMP算法在字符串处理领域具有重要的地位,效率高、实现复杂度低,广泛应用于文本搜索、代码比较等场景。

应用场景

在计算机领域中,字符串匹配是一个非常常见的问题。例如,在网页中搜索关键词、在Git中比较代码变动记录,甚至在论文查重中使用。然而,简单暴力匹配在某些场景下效率极低。例如,一篇论文可能有上千字,而要与上万篇文章进行查重,暴力枚举显然不现实。因此,KMP算法的出现为字符串匹配问题提供了高效的解决方案。

以两个字符串为例,A串是"I hate learning English.",B串是"hate learning"。暴力枚举需要遍历所有可能的起始位置,时间复杂度为O(mn)。而通过KMP算法,只需O(n)时间即可完成匹配。

大牛matrix67在介绍KMP算法时曾说:“如果你喜欢某个MM,你可以问她:‘假如你要向我表白,你的名字是我的告白语中的子串吗?’”这个比喻生动地诠释了KMP算法的优势。

KMP算法的核心——Next数组

KMP算法的关键在于Next数组,但很多人在学习Next数组时感到困惑。我们需要理解Next数组的作用和构建方法。

Next数组的作用是记录在匹配失败时,应该回到哪个中间状态。例如,当B串与A串匹配到某个位置失败时,KMP算法不会从头开始匹配,而是会从Next数组记录的位置继续尝试。这大大减少了不必要的重复计算。

Next数组的构建过程如下:

  • 初始化Next数组,所有元素初始为0。
  • 从第二个位置开始,依次计算每个位置的Next值。
  • 对于位置i,使用Next[i-1]作为起点,寻找最长的前缀匹配。
  • 如果B[Next[i-1]+1]与B[i]匹配,则Next[i] = Next[i-1] + 1。
  • 如果不匹配,则继续寻找下一个可能的前缀,直到找到匹配项或返回0。
  • 算法原理

    KMP算法的核心逻辑是:

    • 使用一个指针(head)跟踪当前匹配位置。
    • 遍历A串中的每个字符,尝试与B串匹配。
    • 如果匹配失败,利用Next数组跳转到下一个可能的位置继续匹配。
    • 如果匹配成功,head移动到下一个位置。
    • 当head指向B串的最后一个位置时,表示完成匹配。

    这种双重循环结构虽然看似复杂,但由于head只在减少或保持不变,因此时间复杂度为O(n)。

    Next数组的具体构建

    我们以B串为例构建Next数组:

  • B串为"hate learning",在构建Next数组时,我们在前面添加一个占位符$,使其变为"$hate learning"。
  • 遍历B串,从第二个字符开始,计算每个位置的Next值。
  • 对于每个位置i,使用Next[i-1]作为起点,寻找最长的前缀匹配。
  • 例如,B串的第三个字符是"a",检查是否与前面匹配,发现"a"与前面的"e"不匹配,继续寻找,最后确定Next[3]=2。
  • 通过这种方法,我们可以构建出完整的Next数组,指导KMP算法高效匹配。

    总结

    KMP算法通过预处理Next数组,解决了暴力匹配的效率问题。其核心思想是利用失败时的中间状态,避免重复工作,实现线性时间复杂度。在学习KMP时,理解Next数组的构建和应用至关重要。通过亲手实现KMP算法,可以更深入地理解其工作原理。如果对逻辑不够清晰,不妨多读几遍或寻找其他资料补充学习。希望今天的文章能帮助你更好地掌握KMP算法。如果喜欢,请点赞、转发,支持创作。

    转载地址:http://qqqfz.baihongyu.com/

    你可能感兴趣的文章
    OAuth2.0_JWT令牌-生成令牌和校验令牌_Spring Security OAuth2.0认证授权---springcloud工作笔记148
    查看>>
    OAuth2.0_JWT令牌介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记147
    查看>>
    OAuth2.0_介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记137
    查看>>
    OAuth2.0_完善环境配置_把资源微服务客户端信息_授权码存入到数据库_Spring Security OAuth2.0认证授权---springcloud工作笔记149
    查看>>
    OAuth2.0_授权服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记140
    查看>>
    OAuth2.0_授权服务配置_三项内容_Spring Security OAuth2.0认证授权---springcloud工作笔记141
    查看>>
    OAuth2.0_授权服务配置_令牌服务和令牌端点配置_Spring Security OAuth2.0认证授权---springcloud工作笔记143
    查看>>
    OAuth2.0_授权服务配置_客户端详情配置_Spring Security OAuth2.0认证授权---springcloud工作笔记142
    查看>>
    OAuth2.0_授权服务配置_密码模式及其他模式_Spring Security OAuth2.0认证授权---springcloud工作笔记145
    查看>>
    OAuth2.0_授权服务配置_授权码模式_Spring Security OAuth2.0认证授权---springcloud工作笔记144
    查看>>
    OAuth2.0_授权服务配置_资源服务测试_Spring Security OAuth2.0认证授权---springcloud工作笔记146
    查看>>
    OAuth2.0_环境介绍_授权服务和资源服务_Spring Security OAuth2.0认证授权---springcloud工作笔记138
    查看>>
    OAuth2.0_环境搭建_Spring Security OAuth2.0认证授权---springcloud工作笔记139
    查看>>
    oauth2.0协议介绍,核心概念和角色,工作流程,概念和用途
    查看>>
    OAuth2.0四种模式的详解
    查看>>
    OAuth2授权码模式详细流程(一)——站在OAuth2设计者的角度来理解code
    查看>>
    oauth2登录认证之SpringSecurity源码分析
    查看>>
    OAuth2:项目演示-模拟微信授权登录京东
    查看>>
    OA系统多少钱?OA办公系统中的价格选型
    查看>>
    OA系统选型:选择好的工作流引擎
    查看>>