KMP算法及Python代码

KMP算法

python代码1:

# -*- coding: utf-8 -*-


def kmp_in(str_a, str_b):
    """
    判断a字符串是否包含b字符串的kmp算法
    """
    # 先算出部分匹配表
    len_a = len(str_a)
    len_b = len(str_b)
    cha = len_b - len_a
    print 'cha: %s' % cha
    part_match = []
    for x in range(1, len_a + 1):
        string = str_a[:x]
        prefix_list = calc_prefix(string)
        suffix_list = calc_suffix(string)
        matched = list(set(prefix_list) & set(suffix_list))
        part_match.append(len(matched[0]) if matched else 0)
    print 'part_match', part_match
    # 逐个匹配
    next_ = 0
    while next_ <= cha:
        print 'next_', next_
        count = 0
        for x in range(0, len_a):
            print 'str_a[%s]: %s, str_b[%s]: %s' % (x, str_a[x], next_ + x, str_b[next_ + x])
            print str_a[x], str_b[next_ + x]
            if str_a[x] == str_b[next_ + x]:
                count += 1
            else:
                print 'count:%s, x:%s, part_match[x]:%s' % (count, x, part_match[x])
                move = count - (part_match[x - 1]) if x != 0 else 1
                move = 1 if move <= 0 else move
                next_ += move
                break
        print 'count:%s' % count
        if count == len_a:
            return next_
    print 'next_:%s, cha: %s' % (next_, cha)
    print 'end, not match'


def calc_prefix(string):
    length = len(string)
    prefix_list = []
    for x in range(1, length):
        prefix_list.append(string[0:x])
    return prefix_list


def calc_suffix(string):
    length = len(string)
    suffix_list = []
    for x in range(1, length):
        suffix_list.append(string[x:])
    return suffix_list


if __name__ == '__main__':
    print kmp_in('ABCDABD', 'BBC ABCDAB ABCDABCDABDE')
    """
    BBC ABCDAB ABCDABCDABDE
                   ABCDABD
    """
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值