在KMP基础上添加最大子串匹配功能

'''
kmp algorithm for string
在字符串匹配的基础上添加了匹配最大长度子串的功能
'''

def match_KMP(target, pattern, pnext):
    t_len, p_len = len(target), len(pattern)
    i, j = 0, 0
    max_pattern = [0]*t_len
    while i < t_len and j < p_len:
        if j == -1 or target[i] == pattern[j]:
            i, j = i+1, j+1
            max_pattern[i-1] = j
        else:
            j = pnext[j]

        if j == p_len:
            pass
    return max_pattern #每个位置都记录target当前已经匹配的最大字符串数目

def gen_pnext(pattern):
    p_len = len(pattern)
    i, j = 0, 0
    pnext = [-1]*p_len
    while i < p_len -1:
        if j == -1 or pattern[i] == pattern[j]:
            i, j = i+1, j+1
            if pattern[i] == pattern[j]:
                pnext[i] = pnext[j] #如果i, j位置上字符相同,则i+1位置上回退时必然和j+1一致
            else:
                pnext[i] = j
        else:
            j = pnext[j]
    return pnext

if __name__ == "__main__":
    target = "asdfghjlqwerthjyhjlgsdjlra"
    pattern = "hjlra"
    max_len = 0 #最大长度,用来存放匹配到的最大子串的长度
    max_str = 0 #最大子串
    for i in range(len(pattern)-1):
        pattern = pattern[i:len(pattern)]
        pnext = gen_pnext(pattern)
        eval1 = match_KMP(target, pattern, pnext)
        print(eval1)
        print("%d"%max(eval1))
        if max(eval1) > max_len: #更新最大长度
            max_len = max(eval1)

        i = 0
        while i < len(target):
            if eval1[i] == max_len:
                max_str = target[(i - max(eval1) + 1):i + 1]#更新最大子串
            i += 1
    print(max_str)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值