python kmp 字串匹配

來源:互聯網
上載者:User

標籤:mp演算法   協助   info   串匹配   學習   kmp演算法   com   成功   pytho   

  先聲明,本人菜鳥一個,寫部落格是為了記錄學習的過程,以及自己的理解和心得,可能有的地方寫的不好,希望大神指出。。。

拋出問題

  給定一個文本串test_str(被匹配的字串)和模式串pat_str(需要從文本串中匹配的字串),從文本串test_str中找出模式串pat_str第一次出現的位置,沒有的話返回 -1

暴力方式

  在說kmp之前,我們先來講下“暴力方式“,也就是說我們最原始的方法。

  

text_str = ‘asdabcdace‘pat_str = ‘abcdace‘def str_match(text_str,pat_str):    for i in range(0,len(text_str)):        j = 1        while j < len(pat_str):            if text_str[i:i+j] != pat_str[0:j]: #從text_str第i個字元開始,看匹配是否成功                break   #匹配失敗,直接跳出迴圈,i+1,繼續從第一個字元匹配            j += 1      #匹配成功就繼續匹配下一個字元,知道pat_str每個字元都匹配完        if j == len(pat_str):            return i    return -1print(str_match(text_str,pat_str))

  之所以稱之為暴力解法,就是因為每次匹配失敗之後就將模式串,向後移動一位,從頭開始匹配,一直迴圈下去。造成時間複雜度高,kmp也就是最佳化這個地方,每一次匹配失敗,下次移動的距離next值

KMP

  如果讓我完全給你講懂kmp演算法可能不太容易,我只能大致粗略的將下它的一步步實現。我認為就一個重點,

  如何求出模式串每個字元對應的next值

    因為可能,每一次匹配失敗的長度的字元不一樣,也就對應每次移動的距離不一樣,那我們如何求每個字元對應的next值,這就引出了另一個概念

    最大首碼最大尾碼

    

  假定最大首碼=最大尾碼,長度為k 那麼第i位字元,對應的next值就為k+1,一次迴圈就能求出每個字元的next值

代碼實現

  

#求字串的next值text_str = ‘asdabcdace‘pat_str = ‘abcdace‘#得到字元對應的next值def str_next(s):    #前兩個字元預設等於1    next = [1,1]    for x in range(2,len(s)):        next.append(str_max_prx(s,x,next[x-1]-1) + 1)    return next#參數 s字串,匹配進行到的位置,下次開始匹配的位置def str_max_prx(s,x,last_value):    next = 0    for i in range(last_value,x):        if s[0:i] == s[x-i:x]:            next = i    return nextdef str_match(s,m):    next = str_next(s)    i=0    s_len = len(s)    m_len = len(m)    while i <= m_len:        flag = True     #標誌位,用來判斷是否匹配成功        index = 1        while index <= s_len:            if m[i:i + index] != s[0:index]:                i = i + next[index]                flag = False                break            else:                index += 1        if flag:            break    if i >= m_len:        i = -1    return ires = str_match(pat_str,text_str)print(res)

  代碼就是這樣,很多東西可能還需要自己理解。我記個筆記,為之後方便尋找,希望對你能有協助。

 

python 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.