KMP 字符串匹配算法

main_list = "aaababaaaaababa"  #主串
sub_list = "ababa"  #字串

getnext函数:

用来给出指示:如果当前位置不匹配,要移动字串的位置多少。这里引入了最大前缀和后缀的概念。
def getnext(sub_list):
    length = len(sub_list)
    next_list = [0 for i in range(length)]
    next_list[0] = -1
    j = -1
    i = 0
    
    while i< length-1:
        
        if j == -1 or sub_list[i]==sub_list[j]:
            j+=1
            i+=1
            next_list[i] = j
        else:
            j = next_list[j]
    
    return next_list

KMP函数:

匹配函数,一次匹配,如果当前位置不匹配,根据getnext数组指示移动数组。返回字串头在主串的位置,若字串不存在与主串中则返回-1
def KMP(main_list, sub_list):
    length_main = len(main_list)
    length_sub = len(sub_list)
    
    next_list = getnext(sub_list)
    
    i=j=0 #初始化
    
    while i<length_main and j<length_sub:
        if j==-1 or main_list[i] == sub_list[j]:
            j += 1
            i += 1
        else:
            j = next_list[j]
        
    if j == length_sub:
        return i-j
    else:
        return -1
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 为什么要写KMP字符串匹配算法呢?因为近段时间在补数据结构和算法,然后重拾大学的《大话数据结构》,记录一下学习的进...
    一剑孤城阅读 9,882评论 0 8
  • KMP字符串匹配算法的实现 暴力查找 这是最简单的一种字符串匹配算法: 使用一个指针 i 跟踪目标文本 txt, ...
    芒果菠萝蛋炒饭阅读 4,375评论 0 0
  • KMP算法是非常高知名度字符串匹配算法,也非常的牛P,具体在哪呢?这个算法每次我想起来的时候,我就要看一遍,自信的...
    NewFinalNull阅读 3,003评论 1 1
  • 今天看了kmp算法,最开始看得特别混乱,最后终于看明白了,想记录一下。https://github.com/hym...
    不会code的程序猿阅读 4,518评论 0 4
  • 心里突然就出现了一句话,人不能没有过去。 总之起因很复杂,结果是我找出了一首叫《告别我的恋人们》的歌,单曲循环了几...
    招财小能手阅读 1,748评论 3 0