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/
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.
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