def getNext(t: str):
next_pos = [-1]
i, k = 0, -1
while i < len(t) - 1:
if k == -1 or t[i] == t[k]:
k += 1
i += 1
if t[i] == t[k]: # next数组的优化
next_pos.append(next_pos[k])
else:
next_pos.append(k)
else:
k = next_pos[k] # 就是找到以 k-1 结尾的最长公共子序列
return next_pos
def KMP(s: str, t: str):
next_pos = getNext(t)
i = j = 0
while i < len(s) and j < len(t):
if j == -1 or s[i] == s[j]: # 如果 j == -1,说明 s[i] != t[0],则 i 和 j 都需要向后移动
i += 1
j += 1
else:
j = next_pos[j]
if j >= len(t):
return True # return i - len(t) 返回匹配初始位置
else:
return False
串匹配——KMP算法
于 2024-08-26 12:14:33 首次发布