KMP算法

背景

匹配字符串,并返回可以匹配到的第一个开始的字符串。leetcode题目28

https://leetcode-cn.com/problems/implement-strstr/solution/shua-chuan-lc-shuang-bai-po-su-jie-fa-km-tb86/

解题思路

先构造好前缀表,然后不相等则退回到前缀表中值的索引位置。例如被匹配的字符串为"ababc", 则构造前缀表为:

前缀串
a0
ab0
aba1
abab2
ababc0

表示"ababc"的所有前缀,对每个前缀找出最长公共前后缀。当作前缀表。最长前缀和最长后缀想等。
在正式使用时,使用下表,即开头加-1,最后一个去掉。

前缀串
-1
a0
ab0
aba1
abab2
代码

在下面的程序中,getnexts被用来构造前缀表:


class Solution(object):
    def strStr(self, haystack, needle):
        a=len(needle)
        b=len(haystack)
        if a==0:
            return 0
        i=j=0
        nexts=self.getnexts(a,needle)
        while(i<b and j<a):
            if j==-1 or needle[j]==haystack[i]:
                i+=1
                j+=1
            else:
                j=nexts[j]
        if j==a:
            return i-j
        else:
            return -1
    
    def getnexts(self,a,needle):
        nexts=['' for i in range(a+1)]
        j = 0
        k = -1
        nexts[0]=k
        while(j<a):
            print("############")
            print("k",k,"j",j)
            if k==-1 or needle[k]==needle[j]:
                print("execute a")
                k+=1
                j+=1
                nexts[j]=k
            else:
                print("execute b")
                k=nexts[k]
            print("k",k,"j",j)
            print("nexts",nexts)
        print("nexts",nexts)
        return nexts

sol = Solution()
res = sol.strStr("abaacababcac", "ababc")
print("res", res)
相关资料

youtube,讲解详细

https://www.youtube.com/watch?v=dgPabAsTFa8

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值