华为机考攻略(python)--字符串操作【9题】(第八题NC149字符串匹配KMP算法)

57 篇文章 4 订阅

系列文章目录


前言

一、NC149字符串匹配KMP算法

描述: 给你一个文本串T,一个非空模板串S,问S在T中出现了多少次
数据范围: 1<=len(S)<=500000,1<=len(T)<=1000000
要求: 空间复杂度O(len(S)),时间复杂度O(len(S)+len(T))
示例1:
输入:“ababab”,“abababab”
返回值:2
示例2:
输入:“abab”,“abacabab”
返回值:1

二、sound code

代码如下(示例):

class Solution:
    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

if __name__ == '__main__':
    s = Solution()
    print(s.kmp("ababab","abababab"))

总结

分享:
只有跳出常规思维,才能化腐朽为神奇;只有多思,智慧的火花才能四溅飞扬,奔跑中的人才能卓尔不群。没有自己思想的生灵如同朽木和僵尸。每个人都应该在心中种上一棵属于自己的心灵常青树。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若竹之心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值