Algoritmo de escritura a mano KMP

Esta es la tercera vez que veo el algoritmo kmp. . Si comprende esta vez, simplemente regístrelo aquí y podrá echarle un vistazo la próxima vez si lo olvida.

Para la siguiente matriz de una cadena, citaré este artículo https://www.acwing.com/solution/content/14666/
inserte la descripción de la imagen aquí
Ahora solo lo puse en el código para solicitar la siguiente matriz y necesito usar dos Punteros, un puntero es para atravesar toda la cadena y el otro es para manejar la longitud de la suma del prefijo.
Por favor agregue una descripción de la imagen.
Por favor agregue una descripción de la imagen.
Por favor agregue una descripción de la imagen.

El siguiente código coincide con los puntos inicial y final de la primera aparición de una subcadena en la cadena principal.

def find_next(p):
    next = [0] * (len(p)+1)
    j,k = 0,-1
    next[0] = -1  # 防止死循环 k一直等于0 j也不加
    while(j < len(p) - 1):
        if (k == -1 or p[j] == p[k]):
            j += 1
            k += 1
            next[j] = k
        else:
            k = next[k]
    next[0] = 0
    return next

if __name__ == '__main__':
    n = int(input())
    p = str(input())
    m = int(input())
    s = str(input())
    next = find_next(p)
    i = 0 # 主串中的指针
    j = 0 # 子串中的指针
    while i < len(s):
        if s[i] == p[j]:
            i += 1 
            j += 1
        elif j > 0:  # 匹配失败,根据next跳过前面的字符串
            j = next[j]
        else :  # 字符串第一个就匹配失败
            i = i + 1
        if j == len(p):
            print(i - j, i-1) # 匹配第一个字符串起始和终点
            break

Supongo que te gusta

Origin blog.csdn.net/abc1234564546/article/details/129194249
Recomendado
Clasificación