KMP算法(python实现)

def get_max_same_str(s):
    """
    获取前后缀相同的最大长度
    :param s: 要计算的字符串
    :return:
    """
    if len(s) == 1:
        return 0
    l = len(s)
    i = l-1
    j = 1
    # 从最长前后缀开始比较,找到相等时直接返回
    while i>=0 and j<l:
        if s[:i] == s[j:]:
            break
        else:  # 无相同字符串最终返回的i=0
            i -= 1
            j += 1
    return i
def get_next(s):
    """
    计算next数组
    :param s:
    :return:
    """
    res_list = [-1]
    for i in range(len(s)-1):
        cur_str = s[:i+1]
        if i==0:
            res_list.append(0)
        else:
            res_list.append(get_max_same_str(cur_str))
    return res_list

def kmp_search(source,patten):
    len_source = len(source)
    len_patten = len(patten)
    if len_source<=1 or len_patten<=1:
        print('source and patten length error')
        return
    next_list = get_next(patten)
    i=0
    j=0
    while i<len_source and j<len_patten:
        if source[i] == patten[j] or next_list[j]==-1:
            i+=1
            j+=1
        else:
            j=next_list[j]
    if j == len_patten:
        return i-j
    else:
        return
print(kmp_search('ababababca','bc'))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值