KMP的DFA 实现

本文介绍了KMP算法解决子字符串查找问题的基本思想,通过理解KMP算法避免回退的原理,深入探讨了DFA(确定有限状态自动机)在KMP中的应用。文章详细阐述了DFA的状态构建和运行过程,以及如何通过DFA实现KMP算法,特别是重启状态的概念和转换规则。
摘要由CSDN通过智能技术生成

目录

 

前言

朴素子字符串查找算法

KMP 算法的基本思想

基于 DFA 的 KMP 实现

 

原文链接

 

朴素子字符串查找算法

KMP 算法是用来解决 子字符串查找 问题的算法,这个问题有一个很朴素(暴力)的解决方式,通常的写法是:

 

 

def bf_search(txt: str, pat: str) -> int:
    i, j, txt_len, pat_len = 0, 0, len(txt), len(pat)

    while i < txt_len and j < pat_len:
        if txt[i] == pat[j]:
            j += 1
        else:
            i -= j  # 回退文本指针 i
            j = 0   # 回退模式指针 j
        i += 1

    if j == pat_len:
        return i - pat_len

    return -1

当pat[j] 与 txt[i] 匹配失败后,i 会 显式的回退, 然后在  i+=1 的位置重新开始匹配

KMP 算法的基本思想

 

在模式指针在 j 处出现了不匹配的情况,那么,这个时候,文本字符串必然已经匹配了 pat[0:j] 这部分模式字符串,此时,在朴素算法中, 我们会回退文本指针并在 右移一位 后继续尝试匹配模式字符串。

也就是说,接下来要尝试匹配的文本字符串是以 pat[1:j] 这个前缀开头的字符串,我们可以利用这一特性,避免重新匹配这个前缀。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值