[串] 字符串匹配——KMP(复盘型笔记)

本文详细解析KMP算法,通过实例探讨如何在字符串匹配中避免不必要的回溯,讲解NEXT数组的计算和作用,以及KMP算法的优化——nextval数组,提升匹配效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路

【主串】ABABCABCACBAB
【模式串】ABCAC
【问题】如何在主串中找到模式串的位置?

(1)方法一:暴力
你能想到的,而且最简单的方法就是:用两层循环遍历两个串,直到完全相同,则返回位置(详细看本文内容:1 【方法一代码】暴力搜索

思考

  1. 方法一当然是最简单最暴力,但是最不省力最不省时间
  2. 但如果你自己运行几个例子,就会发现方法一中有非常非常多不必要的回溯!但是你又说不明道不清
  3. 而KMP就帮你归纳出了很多不必要回溯的情况(详细看本文内容:2 哪些是不必要的回溯?

(2)方法二:KMP算法
避免不必要的回溯:主串指针i不回溯,模式串指针j只往前回溯一点。这非常nice,可以减少很多工作量

  1. KMP这么牛?那它是怎么避免没有必要的回溯?
    详细看:3 KMP怎么避免没有必要的回溯(NEXT数组)
  2. NEXT数组怎么算?
    避免回溯的核心是NEXT数组?那它是怎么算的?(详细看:4 如何求next数组?
  3. KMP是怎么工作的?
    有了NEXT数组以后,我们的匹配工作应该怎么来操作?(详细看本文5 KMP完整代码
  4. KMP算法的改进
    KMP算法已经很牛了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

geodoer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值