KMP算法(Knuth-Morris-Pratt算法)是一种字符串匹配算法,可以在O(n+m)的时间复杂度内实现字符串匹配,其中n和m分别为文本串和模式串的长度。以下是Python实现KMP算法的代码:

def kmp(text, pattern):
    n = len(text)
    m = len(pattern)
    if m == 0:
        return 0
    if n < m:
        return -1
    lps = computeLPS(pattern)
    i = 0
    j = 0
    while i < n:
        if pattern[j] == text[i]:
            i += 1
            j += 1
        if j == m:
            return i-j
        elif i < n and pattern[j] != text[i]:
            if j != 0:
                j = lps[j-1]
            else:
                i += 1
    return -1

def computeLPS(pattern):
    m = len(pattern)
    lps = [0] * m
    i = 1
    j = 0
    while i < m:
        if pattern[i] == pattern[j]:
            j += 1
            lps[i] = j
            i += 1
        elif j != 0:
            j = lps[j-1]
        else:
            lps[i] = 0
            i += 1
    return lps

其中,computeLPS函数实现了计算模式串的最长公共前后缀长度数组。kmp函数中,首先判断模式串是否为空或者文本串长度小于模式串长度,然后计算出模式串的最长公共前后缀长度数组lps。接着,用双指针i和j分别指向文本串和模式串的起始位置,进行匹配。如果当前字符匹配成功,则i和j都向前移动一位,如果匹配失败,则j回退到lps[j-1]的位置。如果j等于模式串长度m,则说明匹配成功,返回文本串中匹配的起始位置i-j。如果整个循环结束都没有匹配成功,则返回-1。

用Python实现kmp算法

原文地址: https://www.cveoy.top/t/topic/Gzm 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录