KMP算法---个人笔记

本文介绍了KMP算法的基本原理和框架,强调了next数组在字符串匹配中的作用,即记录模式串的最长公共前后缀,以减少匹配失败时的重试时间。通过next数组,当匹配失败时,模式串可以从特定位置继续匹配,而无需回溯到起始位置。文中还给出了生成next数组的Python代码,并提供了完整的匹配算法实现。
摘要由CSDN通过智能技术生成

简介
本文是笔者对KMP算法的理解,我会在不断的磨练中去理解KMP算法并加以修改本文的一些不足之处

原理
KMP算法与传统的字符串匹配不同,KMP算法是通过next数组获得当匹配失败的时候下一个跳转到的字符的位置,然后在此位置上继续匹配,而不需要在每次匹配失败的时候返回到首字符重新匹配

框架
KMP算法主要由两部分组成:1、生成模式串的next数组 2、根据next数组进行字符串匹配

步骤&解析
1、生成模式串的next数组
next数组的作用是记录每一个字符的最长公共前后缀(前缀是包含首字符但不包含尾字符的子串,如abcd的前缀包括a,ab,abc但不包括abcd,因为含有尾字符d;后缀是包含尾字符但不包含首字符的子串,如abcd的后缀包括d,cd,bcd但不包括abcd,因为含有首字符a),如abab的最长公共前缀是ab,ababa的最长公共前缀是aba,通过记录最长公共前后缀就可以知道主串与模式串在某一个字符匹配失败时应该跳到模式串的哪一个位置继续匹配,从而减少了匹配时间。

上图为模式串与其对应的next数组,默认首个字符在next数组的值为0,假设模式串为s,s[1]的最长公共前后缀为0,因为s[0]和s[1]不相等,s[2]的最长公共前后缀为1,因为s[0]=s[2],s[3]的最长公共前后缀为2,因为s[0:2]=s[2:4],所以最长公共前后缀为2,以此类推

那么,应该如何根据next数组来跳转呢?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值