KMP算法

作者: Cichar | 来源:发表于2017-06-05 21:51 被阅读0次
def kmp_match(target, part):
    """ kmp算法 """

    def create_next():
        """ 构建next数组 
            create_next('ABCDABD') = [0, 0, 0, 0, 1, 2, 0]
        """
        # 生成前缀
        prefix = {part[:i] for i in range(1, len(part))}
        postfix = {}
        _ = [0]
        # 生成next数组
        for i in range(1, len(part)):
            # 生成每个子串的后缀
            # 'ABCDABD'
            # {'B'}
            # {'BC', 'C'}
            # {'CD', 'BCD', 'D'}
            # {'BCDA', 'CDA', 'A', 'DA'}
            # {'DAB', 'BCDAB', 'AB', 'CDAB', 'B'}
            # {'BCDABD', 'BD', 'D', 'ABD', 'CDABD', 'DABD'}
            postfix = {part[j:i + 1] for j in range(1, i + 1)}
            # 计算并向next_list添加每一位的适配度
            _.append(len((prefix & postfix or {''}).pop()))
        return _

    target_len = len(target)
    part_len = len(part)
    next_list = create_next()
    cur = 0
    # 即便一位一位右移,最坏的情况有 target_len - part_len 次需要右移
    while cur <= target_len - part_len:
        # 匹配子串
        for i in range(part_len):
            if target[i + cur] != part[i]:
                # 出现了不匹配的坏字符,则进行右移
                # 移动位数 = 已匹配的字串长度 - 字符匹配度
                # 最少像右移动一位
                cur += max(i - next_list[i - 1], 1)
                break
        else:
            return cur
    return -1

if __name__ == '__main__':
    a = kmp_match('fergdvwertergasfwqerfdsf', 'terg')
    print(a) # 输出为9

相关文章

  • KMP 专题整理

    KMP 学习记录 kuangbin专题十六——KMP KMP 学习总结 朴素 KMP 算法 拓展 KMP 算法(E...

  • 对KMP算法的一些理解

    最近学到KMP算法,下面讲讲对KMP算法的一些个人理解,希望对大家有帮助! 对于KMP算法的理解: 整个KMP算法...

  • KMP算法文章合集

    字符串的查找:朴素查找算法和KMP算法 暴力匹配算法与KMP算法(串的匹配) 字符串查找算法BF和KMP 字符串匹...

  • 串的模式匹配算法

    KMP算法 算法匹配

  • 问答|KMP算法学习笔记

    问题 目录KMP是什么,做什么用的KMP算法的高效体现在哪如何KMP算法的next数组KMP的代码KMP的时间复杂...

  • KMP算法——寻找子串位置

    KMP算法——寻找子串位置 1、KMP算法简介: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J....

  • 字符串匹配 - KMP算法

    前面我们介绍非常高效的 BM 算法,今天我们介绍另一个非常出名且高效的 KMP 算法。 KMP 算法思想 KMP ...

  • KMP算法及优化

    转载请注明出处: KMP算法及优化 今天看到同学在复习数据结构书上的KMP算法,忽然发觉自己又把KMP算法忘掉了,...

  • KMP算法(字符串匹配问题)

    一、是什么? 注意,是KMP算法,不是MMP哈,我没有骂人。KMP算法是用来做字符串匹配的,除了KMP算法分,还有...

  • KMP算法

    KMP算法

网友评论

      本文标题:KMP算法

      本文链接:https://www.haomeiwen.com/subject/nhuwfxtx.html