Python實現字串的KMP演算法

來源:互聯網
上載者:User

本文執行個體講述了Python實現字串的KMP演算法。分享給大家供大家參考,具體如下:

KMP演算法Python實現

今天研究KMP演算法,看來很多版本,有不同的語言寫的,但是感覺越看越亂,最後自己試著寫一份進行總結


首先,KMP演算法使字串匹配中的最佳化演算法,使原來的O(m*n)降到了O(m+n)

關於他的理解,我推薦先看視頻,他講的很清楚了。汪都能聽懂的KMP字串匹配演算法
然後從可視化方面理解,推薦看看如何更好的理解和掌握 KMP 演算法? - 佑子的回答 - 知乎容
最後從代碼層理解Searching for Patterns | Set 2 (KMP Algorithm)
代碼不要看太多別人的,我感覺好多人寫的也有問題,我在自己運行處問題時,有看有些同學寫的,被帶到其他坑裡了。。。
最後記錄代碼

'''先求next數組'''def next_list(pattern):    next=[]    pattern_list=list(pattern)    j=0    i=1    for s in range(len(pattern)):        #第一位一直是0        if s==0:            next.append(0)        #看第i個和第j個字母是否相同,如果相同,則累加        #同時i,j同時右移        elif(pattern_list[i]==pattern_list[j]):                       next.append(j+1)            j+=1            i+=1        #如果不相同,則next為0,同時j也退回第一個位置,i繼續前進一個位置        else:            next.append(0)            j=0            i=s+1    print(next)    return nextnext_list('ABABCABAB')      def kmp(text,pattern):    #text的位置    i=0    #pattern的位置    j=0    next=next_list(pattern)    if(not(text and pattern)):        print('字串為空白,請輸入字串')    elif(len(text)<len(pattern)):        print('原字串過小')    elif(text==pattern):        print('字串一致')    else:        while( (i<len(text) )):            print((text[i],pattern[j]))            print(i,j)            #如果相同,則進行下一個對比            if( text[i]==pattern[j]):                i+=1                j+=1            #判斷是不是匹配完了            if j==len(pattern):                print('從第{0}個位置開始匹配'.format(i-j))                j=next[j-1]            #如果不匹配,則j反回到前一個字母對應的next            elif i<len(text) and text[i]!=pattern[j]:                #我就是少了這個判斷,一直有問題,就是在不匹配後的第二步,後面這個很關鍵                if j!=0:                #這個就是精髓了,如果不匹配,就去找第一個和這個匹配的字串,然後在這個前面的匹配字串                #的後一個字母拿出來,再與長text比較的第i個字母比較                    j=next[j-1]                #如果j已經回到了0,則通過增加i,text移動到下一個字母                else:                    i+=1# text = "ABABDABACDABABCABAB"# pattern = "ABABCABAB"            text='abxabcabcaby'pattern='abcaby'kmp(text,pattern)#output:next=[0, 0, 0, 1, 2, 0]('a', 'a')0 0('b', 'b')1 1('x', 'a')2 0('a', 'a')3 0('b', 'b')4 1('c', 'c')5 2('a', 'a')6 3('b', 'b')7 4('c', 'c')8 2('a', 'a')9 3('b', 'b')10 4('y', 'y')11 5從第6個位置開始匹配

相關推薦:

KMP演算法最淺顯理解

kmp演算法詳解

KMP演算法中最難理解的地方的理解

kmp演算法原理及實現

圖解KMP演算法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.