KMP算法----学习笔记

博客主要解决文本匹配问题,介绍了暴力匹配和KMP算法。暴力匹配时间复杂度为O(mxn),KMP算法通过计算最长相等前后缀和前缀表,可省去重新匹配前缀的过程。还提及了前缀表不同存储方式及代码流程,最后给出笔记来源视频地址。

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

主要解决:文本匹配的问题

例子:

文本串:aabaabaaf

模式串:aabaaf

  1. 暴力匹配  时间复杂度 O(mxn)
  2. KMP

前缀:不包含尾字母的所有子串(模式串中:a\aa\aab\aaba\aabaa都是)

尾缀:不包含首字母的所有子串模式串中:f\af\aaf\baaf\abaaf都是)

最长相等前后缀:

a

0

aa

1

aab

0

aaba

1

aabaa

2

aabaaf

0

前缀表:  aabaaf的前缀表010120

 

思路:

从模式串第一个字母往后匹配,匹配到f发现不匹配了,就找前一个子串aabaa的最长相等前后缀,根据前缀表知道值为2,因此,跳到模式串下标为2的位置开始重新匹配。(因为前缀与后缀相等,省去了重新匹配前缀的过程)

 

 

具体代码实现:

  1. next/prefix数组都是指的前缀表中存放的内容,但是有些人喜欢将存储时内容整体右移或者数值减1.

即:  aabaaf

标准:010120

右移:-101012  : 思路中修改后就是比较的时候不满足的时候找当前冲突位置的下标索引

减1: -10-101-1 : 思路中修改后就是比较的时候不满足的时候找当前冲突位置前一位的下标索引+1

  1. 代码流程:
    1. 初始化
    2. 前后缀不相同的处理
    3. 前后缀相同的处理
    4. next数组
  2. 伪代码:
"""
# file and template
# @project : Code_Server
# @Time : 2020/12/1 14:49
# @Author : twinkle 
# @File : KMP主要伪代码.py
# @Software: PyCharm
# @link : 
# @introduction:
"""
i后缀末尾 j前缀末尾:j还代表i(包含i)的子串的最长相等前后缀的长度
void getNext(next,s){
    j=0
    next[0]=0
    for(i=1;i<s.size;i++){
        # “遇见冲突看前一位”----代码不变量
        # 是连续回退的过程,用while,不用if
        while s[i]!=s[j]  && j>0:
            j = next[j-1]  # 取前缀表中冲突的前一位的值
        # 前后缀相同,继续比较,i在for里后移,j后移
        if s[i]==s[j]:
            j++
        next[i]=j  # 更新next
    }
}

 

 

笔记来源  视频地址:

https://www.bilibili.com/video/BV1PD4y1o7nd

https://www.bilibili.com/video/BV1M5411j7Xx

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值