题解 | #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
【牛客&amp;赛文X】春招冲刺 文章被收录于专栏

仅作记录。

全部评论

相关推荐

点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务