KMP算法(python)

KMP算法(python)

(1)暴力搜索算法

复杂度:O(m*n)

def strMacth(t,p):
    m,n=len(t),len(p)
    i,j=0,0
    while i<m and j<n:
        if p[j]==t[i]:
            j,i=j+1,i+1
        else:
            j,i=0,i-j+1
    if j==n:
        return i-j
    else:
        return -1

t="ababcabcacbab"
p="abcac"
x=strMacth(t,p)
print(x)

#结果:5
(2)算法
(2.1)求解pnext表的过程:

在这里插入图片描述
在这里插入图片描述
去掉尾部一行并在头部前面添加-1,得到:

(2.2)KMP代码实现:

复杂度:O(n)


def gen_pnext(p):
    #生成针对p中各位置i的下一检查位置函数,用于KMP算法
    i,k,m=0,-1,len(p)
    pnext=[-1]*m     #初始数组全部元素为-1
    while i<m-1:     #生成下一个pnext元素值
        if k==-1 or p[i]==p[k]:
            i,k=i+1,k+1
            pnext[i]=k  #设置pnext元素
        else:
            k=pnext[k]  #退回更短相同前缀
    return pnext 

def KMP(t,p,pnext):
    j,i=0,0
    n,m=len(t),len(p)
    while j<n and i<m:
        if i==-1 or t[j]==p[i]:
            j,i=j+1,i+1
        else:
            i=pnext[i]
    if i==m:
        return j-i
    return -1

t="ababcabcacbab"
p="abcac"
pnext=gen_pnext(p)
x=KMP(t,p,pnext)
print(x)

#结果:5
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值