kmp字符串匹配

117 阅读1分钟

kmp 算法字符串匹配, kmp算法的时间复杂度是O(m+n), 复杂的地方是计算next数组,用动态规划的方式计算next数组

def kmp(m_str, p_str):
    m = len(m_str)
    n = len(p_str)
    j = 0
    next_list = getNext(p_str)
    print(next_list)
    for i in range(m):
        while j > 0 and m_str[i] != p_str[j]:
            j = next_list[j-1] + 1
        if m_str[i] == p_str[j]:
            j += 1
        if j == n:
            return i - n + 1
    return -1

def getNext(p_str):
    n = len(p_str)
    k = -1
    next_list = [-1] * n
    for j in range(1, n):
        while k != -1 and p_str[k+1] != p_str[j]:
            k = next_list[k]
        if p_str[k+1] == p_str[j]:
            k += 1
        next_list[j] = k
    return next_list


test_kmp = kmp('1yhfcn12314', '1231')
print(test_kmp)