#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 计算模板串S在文本串T中出现了多少次
# @param S string字符串 模板串
# @param T string字符串 文本串
# @return int整型
#
class Solution:
    def kmp(self , S: str, T: str) -> int:
        # write code here
        def next_cal(S):
            prefix = 0
            m = len(S)
            next_val = [0]
            for i in range(1,m):
                if S[i]==S[prefix]:
                    prefix+=1
                elif prefix>0:
                    prefix = next_val[prefix-1]
                next_val.append(prefix)
            return next_val
        
        cnt = 0
        i,j = 0,0
        m,n = len(S),len(T)
        next_val = next_cal(S)
        while(i<n):
            if T[i]==S[j]:
                i+=1
                j+=1
                if j==m:
                    cnt+=1
                    j = next_val[j-1]
            elif j>0:
                j = next_val[j-1]
            else:i+=1
        return cnt

对原本的KMP算法增加了记录数量的功能,其实就是把主函数中:j到数组末端的时候认为“不匹配”,然后触发原本KMP算法中的j的回退:j = next[j-1]就可以了,每当j到达patt串末端,都使得计数结果res+1,最后返回res