题解 | #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】春招冲刺 文章被收录于专栏

仅作记录。

全部评论

相关推荐

牛客29046817...:优化一下简历,突出重点,简历上的技能复习扎实,实习工作啥的整理成文档梳理一下怎么说要有自己的思考在里边,岗位的话运维,测试,开发,实施,技术支持能投的都投,多投递能找到的,秋招投递了3个月左右(8月中旬到11月下旬),boos打招呼8000多次,官网投递300多家,才找到一家满意的
点赞 评论 收藏
分享
04-01 12:25
中南大学 Java
枯基Evan_:腾讯一面写过11次的题目没写出来
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务