题解 | #kmp算法#
kmp算法
https://www.nowcoder.com/practice/bb1615c381cc4237919d1aa448083bcc
空间复杂度O(len(S),时间复杂度 O(len(S)+len(T))
【最浅显易懂的 KMP 算法讲解】https://www.bilibili.com/video/BV1AY4y157yL
from sys import prefix
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 计算模板串S在文本串T中出现了多少次
# @param S string字符串 模板串
# @param T string字符串 文本串
# @return int整型
#
class Solution:
def kmp(self , S: str, T: str) -> int:
# write code here
s = len(S)
t = len(T)
if (s > t or t == 0):
return 0
def getNext(S):
s = len(S)
next = [0] # 初始值为0
prefix_len = 0 # 最长公共前后缀长度,常写为j
i = 1
while i < s:
# 当前字符依旧相同,可以生成更长的前后缀
if S[prefix_len] == S[i]:
prefix_len += 1
next.append(prefix_len)
i += 1
# 当前字符不相同,查看有无次长的前后缀
else:
# 不存在设为0
if prefix_len == 0:
next.append(0)
i += 1
else:
# 直接去找以前算过的次长前后缀去比较
prefix_len = next[prefix_len-1]
return next
cnt = 0
next = getNext(S)
# i是T的索引,j是S的索引
j = 0
for i in range(t):
# 不匹配就找次长前后缀去比较
while(j > 0 and S[j] != T[i]):
j = next[j-1]
# 相等往前推
if (S[j] == T[i]):
j += 1
# 匹配成功次数加一
if (j == s):
cnt += 1
j = next[j-1]
return cnt
【牛客&赛文X】春招冲刺 文章被收录于专栏
仅作记录。

