题解 | #KMP python#

kmp算法

http://www.nowcoder.com/practice/bb1615c381cc4237919d1aa448083bcc

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

计算模板串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
全部评论
你好,有个问题想咨询一下,当找出来一个后,j = pnext[j] ,此时j的值为模板串最大的前后缀相同元素个数(假设6个元素,结果为3),此时循环如果刚好,第3,4,5位于文本串i循环相等,但我实际并没有比对第1,2位与文本串的结果啊
点赞 回复 分享
发布于 2023-04-23 15:27 四川

相关推荐

我是小红是我:学校换成中南
点赞 评论 收藏
分享
11-11 14:21
西京学院 C++
Java抽象练习生:教育背景放最前面,不要耍小聪明
点赞 评论 收藏
分享
3 收藏 评论
分享
牛客网
牛客企业服务