python实现字符串模式匹配KMP算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yinhui_zhang/article/details/89060927

       讲在前面的话,KMP算法是字符串中匹配的快速算法,时间复杂度为O(m+n) 。KMP算法的核心思想主要通过分析前面字符串的信息的来滑动匹配字符串,避免当不匹配时像传统匹配算法回溯到匹配字符串的开头,而当不匹配时如何滑动这个问题就是由next[j]数组来决定,而求next[j]数组的核心思想就是将匹配字符串互相错开一个位置来计算。关于具体理论和图解部分请参考reference。

1.暴力模式匹配算法

def naive_match(s, p):
    res = []
    m = len(s); n = len(p)
    for i in range(m-n+1):
        if s[i:i+n] == p:
            res.append(i)
    return res

2.KMP算法

def KMP(mon_string, son_string):
    i = 0; j = 0
    next = get_next(son_string)
    while(i < len(mon_string) and j < len(son_string)):
        if mon_string[i] == son_string[j]:
            i +=1; j +=1
        else:
            j = next[j]
    
    if j == len(son_string):
        return i-j
    return -1

def get_next(son_string):
    next = [-1]*len(son_string)
    next[1] = 0
    i =1; j =0
    while i<len(son_string)-1:
        if j == -1 or son_string[i] == son_string[j]:
            i +=1
            j +=1
            next[i] = j
        else:
            j = next[j]
    
    return next

reference:

1.KMP模式搜索算法动画演示

2.[KMP算法]NEXT数列手算演示

3.KMP错开计算next

猜你喜欢

转载自blog.csdn.net/yinhui_zhang/article/details/89060927