KMP算法

在这里插入图片描述

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 计算模板串S在文本串T中出现了多少次
# @param S string字符串 模板串
# @param T string字符串 文本串
# @return int整型
#
class Solution:
    def kmp(self , S , T ):
        def getnext(S):
            '''
            计算next数组是KMP算法的核心,当模式串中有重复子串时有加速作用
            用于存放前面已经匹配的子字符串的字符数量,回溯时仅需选取最长的一个开始
            '''
            # next中为-1表示还未出现从头开始的重复子串
        	# 非-1的值加一:表示作为重复子串的当前已经匹配的子字符串的字符数量
            n = len(S)
            Next = [-1] * n
            j = -1
            for i in range(1, n):
                while(j >= 0 and S[i] != S[j + 1]):
                	# 计算新的一次匹配时,可以先查看前面已经匹配了多少个字符
            		# 若为-1,则表示没有一个字符已经匹配,则需要从模式串的第一个字符开始匹配
                    j = Next[j]
                if S[i] == S[j + 1]:
                    j += 1
                Next[i] = j
            return Next
        
        sn, tn = len(S), len(T)
        if tn < sn: return 0
        
        Next = getnext(S)
        r = 0
        j = -1 # 默认从模式串第一个字符开始寻找
        for i in range(tn): # 遍历字符串的长度
            while j >= 0 and T[i] != S[j + 1]:
            	# 查看是否需要从模式串第一个字符开始匹配
            	# 若是Next[j]的值是-1,则需要
                j = Next[j] # 若存在不匹配的字符,则从next数组中取出字符下标进行回溯
                
            # 若当前字符与模式串匹配,则匹配的模式串字符数加一
            if T[i] == S[j + 1]:
                j += 1
            
            # 达到模式串长度,则出现一次匹配,累加一次
            if j + 1 == sn:
                r += 1
                # 计算新的一次匹配时,可以先查看前面已经匹配了多少个字符
            	# 若为-1,则表示没有一个字符已经匹配,则需要从模式串的第一个字符开始匹配
                j = Next[j]
        return r
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值