模式匹配之kmp算法

模式匹配之kmp算法

b站视频:https://www.bilibili.com/video/av11866460/

https://www.bilibili.com/video/av16828557/?spm_id_from=333.788.videocard.1

# 找到模式的prefix_table
def prefix_table(pattern, prefix, n):
    prefix[0] = 0
    length = 0
    i = 1
    while i < n:
        if pattern[i] == pattern[length]:
            length += 1
            prefix[i] = length
            i += 1
        else:
            if length > 0:
                length = prefix[length - 1]
            else:
                prefix[i] = length
                i += 1
    return prefix


# 移动prefix_table以便kmp算法的匹配
def move_prefix_table(prefix, n):
    i = n - 1
    while i > 0:
        prefix[i] = prefix[i - 1]
        i -= 1
    prefix[0] = -1
    return prefix


# kmp算法实现
def kmp_search(text, pattern):
    n = len(pattern)
    prefix = [0 for _ in range(n)]
    prefix = prefix_table(pattern, prefix, n)
    prefix = move_prefix_table(prefix, n)
    m = len(text)
    i = 0
    j = 0
    while i < m:
        if j == n - 1 and text[i] == pattern[j]:
            print(f"Found pattern at {i - j}")
            j = prefix[j]
        if text[i] == pattern[j]:
            i += 1
            j += 1
        else:
            j = prefix[j]
            if j == -1:
                i += 1
                j += 1


if __name__ == '__main__':
    pattern = 'ABABCABAA'
    text = 'ABACABABCABAABABCAB'
    kmp_search(text, pattern)
# Found pattern at 4

转载于:https://www.cnblogs.com/DcentMan/p/11402411.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值