2024.6.14KMP算法学习记录

目录

一、学习视频

二、跟练代码


主要是想起到一个记录的作用

一、学习视频

【最浅显易懂的 KMP 算法讲解】 https://www.bilibili.com/video/BV1AY4y157yL/?share_source=copy_web&vd_source=dc0e55cfae3b304619670a78444fd795

二、跟练代码

代码来自视频

# KMP算法
def build_next(patt):
    # 计算next数组
    # 是关于子串的,输入子串
    next = [0]  # 注意初始化,第一个肯定为0
    prefix_len = 0  # 当前 共同前后缀的长度
    n = len(patt)
    i = 1
    while i < n:
        # 匹配
        if patt[prefix_len] == patt[i]:
            prefix_len += 1
            next.append(prefix_len)
            i += 1
        # 不匹配
        else:
            if prefix_len == 0:
                next.append(0)
                i += 1
            else:
                # 查看已匹配中是否存在更短的前后缀
                # 找到前一位置的next值,跳转,i不变
                prefix_len = next[prefix_len - 1]
    return next

def kmp_search(string, patt):
    next = build_next(patt)
    i, string_len = 0, len(string)  # 主串
    j, patt_len = 0, len(patt)      # 子串
    while i < string_len:
        if string[i] == patt[j]:
            i += 1
            j += 1
        elif j > 0:
            j = next[j - 1]
        else:
            i += 1
        
        if j == patt_len:
            return i - j    # 返回起始位置

感谢你看到这里!一起加油吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值