kmp匹配

主串与模式串匹配,关键在于主串不回溯,模式串进行特殊编码,对比与bf算法的异同

s="ababcabcabcacbab"
t="abcac"

#s="hasdefregrtshgtrhrthrth"
#t="hrthry"
#t="abcaababc"

slen=len(s)
tlen=len(t)

next=[0]*len(t)

def KMP():
    i = 0
    j = 0
    o=0
    while i < slen and j < tlen:
        o+=1
        #将next数组的首位设为-1
        if s[i] == t[j] or j==-1:
            i += 1
            j += 1
        #i,j对应字段不相等
        else:
           #获取编码
            j = next[j]
    print("O(x)=",o)
    if j >= tlen:
        return i - tlen
    else:
        return 0


"""
将模式串从头至尾与模式串从头至尾进行比较,对模式串进行编码
next函数关键
重点是
1.两个字段相等,i与j都增加
2.两个字段不等i==0,j增加
3.两个字段不等i!=0,i=0,不能错过j对应的字段与首位的比较
"""
#求next数组值
def getNext():
    i=0
    j=1
    #
    next[0]=-1
    while j<len(t):
        #print("j=",j)
        #print("i=", i)
        #print(next)
        #判断是否相等,相等就都增加
        if t[i]==t[j]:
            #给过值,不在给值
            if next[j]==0:
                next[j] = i
            i+=1
            j+=1
        #不相等,并且i等于0,
        elif i==0:
            if next[j] == 0:
                next[j] = i
            j += 1
        #不相等,并且i不等于0,将i设为0,j不变,判断后面的字符是否与
        elif i!=0:
            if next[j] == 0:
                next[j] = i
            i=0
    print(next)

getNext()
print(KMP())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值