KMP字符串匹配(python描述)

KMP匹配字符串时,如果匹配字符失败了,并不从头再匹配,而是回溯到一个特定的位置,这个位置和需要匹配的字符串有关,用next数组记录匹配每个位置失败时要回溯的位置。这样就能减少回溯和匹配的次数,从而提高计算效率。
计算next数组:

def GetNext(s:str)->list:
    n = len(s)
    k = 0
    Next = [-1]#首个匹配失败会返回-1
    for i in range(1,n):#从第二个字符开始匹配
        Next.append(k)#s[i]匹配失败就回溯到s[k],再开始匹配
        while k!=-1 and s[k]!=s[i]:#如果s[k]和s[i]相同,那么k无需回退
            k = Next[k]#如果不同,将k回退到s[k]匹配失败要回退的位置,直到k==-1,或者s[k]==s[i]
        k+=1
    return  Next

这个过程就像需要0匹配的字符串自己和自己匹配,也叫字符串的自匹配。
下面举个例子:
在这里插入图片描述
然后是kmp比较的函数:

def KmpLocation(s1:str,s2:str)->int:#s1为大字符串,s2位要被匹配的字符串
    Next = GetNext(s2)
    n = len(s1)-len(s2)#字符串长度的差
    j = 0
    for i in range(0,len(s1)+1):
        if j == len(s2):#j指到s2的最后一个字符后面表示匹配成功
            return  i-j#返回匹配成功时s1的相应索引
        if i==len(s1):#i已经指到了s1的最后一个字符串,但是j还没到s2的最后一个字符串
            return -1#匹配失败
        while j!=-1 and s1[i]!=s2[j]:
            j = Next[j]
        j+=1

相应的实例:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值