字符串匹配算法KMP算法介绍与代码实现

暴力匹配字符串

暴力递归匹配字符串指的是一种基于递归的字符串匹配方法,其核心思想是将字符串匹配问题不断地拆分成更小的子问题,并通过递归求解子问题来达到整体求解的目的。具体实现过程中,可以采用类似于“回溯”的方式,在文本串中依次检查每个可能的起始位置,并尝试用模式串去匹配。如果发现不匹配,则回溯到前一个位置重新开始匹配。由于暴力递归算法需要枚举所有可能的匹配位置,时间复杂度较高,并不能很好地应对大规模数据的字符串匹配问题。

KMP算法介绍

KMP算法(Knuth-Morris-Pratt算法)是一种用于字符串匹配的算法,它的时间复杂度为O(n+m),其中n为文本串的长度,m为模式串的长度。该算法的核心思想是避免在模式串不匹配的情况下重复比较已经匹配的部分。具体实现是通过预处理模式串,建立一个部分匹配表(partial match table),根据表中记录的信息来调整模式串的匹配位置。这样就可以避免在文本串中回溯,从而实现线性时间复杂度的字符串匹配。
在这里插入图片描述

代码实现(python)

def KMPSearch(pattern,text):
    m = len(pattern) # 模式字符串的长度
    n = len(text)     # 文本字符串的长度

    # 预处理next数组
    next = [0] * m  # 初始化next数组为全0
    j = 0
    for i in range(1,m):  # 从第二个字符开始匹配
        while j > 0 and pattern[j] != pattern[i]:  # 如果不匹配,则回溯
            j = next[j - 1]  ## 回溯到前一个字符的next值
        if pattern[j] == pattern[i]:  # 如果匹配,则将j指向下一个字符
            j += 1
        next[i] = j  # 记录当前字符的next值

    # 在 text中查找pattern
    j = 0  # 初始化模式字符串的指针
    for i in range(n):   # 从文本字符串的第一个字符开始匹配
        while j >0 and pattern[j] != text[i]:   # 如果不匹配,则回溯
            j = next[j -1]   # 回溯到前一个字符的next值
        if pattern[j] == text[i]:  # 如果匹配,则将j指向下一个字符
            j += 1
        if j == m:   # 如果j等于m,则表示已经匹配成功
            return i -m +1   # 返回模式字符串在文本字符串中的起始位置
    return -1  # 如果没有找到,则返回-1

text = "ABCABCABCD"
pattern = "CAB"
pos = KMPSearch(pattern,text)
if pos == 1:
    print("未找到")
else:
    print("找到了")

具体的实现就是这样,跟着代码的逻辑走一遍就能理解了。

猜你喜欢

转载自blog.csdn.net/m0_58353740/article/details/129872302