代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可

计算模板串S在文本串T中出现了多少次

@param S string字符串 模板串

@param T string字符串 文本串

@return int整型

def kmp(self , S: str, T: str) -> int:
    if S == '': return 0
    n = len(S)
    m = len(T)
    j = 0
    pnext = self.getnext(S)
    res = []
    for i in range(m):
        while j > 0 and S[j] != T[i]:
            j = pnext[j] #对应位置不匹配就一直回溯,直到回溯到0
        if S[j] == T[i]:
            j += 1    #如果对应位置相等就前进
        if j == n:
            res.append(i-n+1)  #直到和S等长,把这个初始位置记录到res里
            j = pnext[j] #这步相当于再回溯,其实是为了继续找新的pattern
    return len(res)

   
    
#建立一个pnext回溯前缀表,指S里的前缀和后缀拆分到底以后有多少相同的元素
def getnext(self, s):
    n = len(s)
    pnext = [0, 0]  #没太理解网上教的-1之类的,初始化两个0,因为前两位是不可能有其他值的
    j = 0           #如果只初始化一个0,在匹配函数里j = -1
    for i in range(1, n):
        while j > 0 and s[i] != s[j]:
            j = pnext[j] # s[j] != s[i]的话j一直是0位,等待相等了以后再往出走
        if s[j] == s[i]:
            j += 1
        pnext.append(j)
    return pnext
    # write code here