第十一章 串(上)

定义

这里写图片描述
这里写图片描述

串匹配

这里写图片描述

蛮力匹配

这里写图片描述
这里写图片描述

def match(t,p):
    # t: 文本串; p: 模式串
    m=len(p)
    n=len(t)
    i=0;j=0
    while i<n and j<m:
        if t[i]==p[j]:
            i+=1; j+=1
        else:
            j=0
            i=i-(j-1)
    return i-j #如果i-j>n-m匹配失败

这里写图片描述

def match(t,p):
    n,m=len(t),len(p)
    for i in range(n-m+1):
        j=0
        while j<m:
            if t[i+j]==p[j]:
                j+=1
            else:
                break
        if j==m:
            break #匹配成功
    return i

这里写图片描述

字母表越短,模式串越长,出现最坏情况的可能性越大:
这里写图片描述

KMP算法

这里写图片描述
这里写图片描述
这里写图片描述

查询表

当文本串和模式串在T[i]和P[j]处匹配失败:
需要找到n[j],即模式串需要向后滑动多少,这个位置只和模式串有关。
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

理解next[]表

KMP:使模式串快速的后移,避免许多不必要的比较
这里写图片描述

KMP的重点就在于当某⼀一个字符与主串串不不匹配时,我们应该知道j指针要移动到哪?

如图:C和D不不匹配了了,我们要把j移动到哪?显然是第1位。为什什么?因为前⾯面有⼀一个A相同:
这里写图片描述

这里写图片描述
可以把j指针移动到第2位,因为前⾯面有两个字⺟母是⼀一样的:
这里写图片描述

这里写图片描述

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

构造next[]表

这里写图片描述

next[j]=k
如果P[k]=P[j]: next[j+1]=next[j]+1
这里写图片描述
这里写图片描述

next[j]=k
如果P[k]!=P[j]: k=next[k]
这里写图片描述
这里写图片描述

这里写图片描述

这里写图片描述
这里写图片描述

def kmp(t,p):
    next=buildnext(p)
    n,m=len(t),len(p)
    i=0;j=0
    while i<n and j<m:
        if t[i]==p[j] or j<0:
            i+=1; j+=1
        else:
            j=next[j]

    return i-j

def buildnext(p):
    j=0
    m=len(p)
    next=[0]*len(p)
    next[0]=-1
    t=next[0]
    while j<m-1:
        if t<0 or p[j]==p[t]:
            j+=1
            t+=1
            next[j]=t
        else:
            t=next[t]
    return next


next=buildnext("abcdabc")
print (next)
# -1,0,0,0,0,1,2


print (match1("abdcg","dc"))
print (match2("abdcg","dc"))
print (kmp("abdcg","dc"))

KMP复杂度分析

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值