kmp匹配

来源:互联网 发布:网络乞丐mc吴迪 编辑:程序博客网 时间:2024/06/10 22:07

主串与模式串匹配,关键在于主串不回溯,模式串进行特殊编码,对比与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())
0 0
原创粉丝点击