最長公用子串和子序列的Python實現,帶圖示。

來源:互聯網
上載者:User

標籤:com   關係   long   技術分享   pytho   range   bdc   bcb   .com   

使用矩陣來記錄兩個子串之間各個字元之間的對應關係。

最長子串:矩陣中數字最大的就是最長子串的長度。若對應位置字元相同,則c[i][j] = c[i-1][j-1] + 1

 

 1 def longSubStr(str1,str2): 2     len1 = len(str1) 3     len2 = len(str2) 4     longest,start1,start2 = 0,0,0 5     c = [[0 for i in range(len2+1)]for i in range(len1+1)] 6     for i in range(len1+1): 7         for j in range(len2+1): 8             if i == 0 or j == 0: 9                 c[i][j] = 010             elif str1[i-1] == str2[j-1]:11                 c[i][j] = c[i-1][j-1]+1                 12             else:13                 c[i][j] = 014             if (longest < c[i][j]):             15                 longest = c[i][j]16                 start1 = i-longest17                 start2 = j-longest18              19     return str1[start1:start1+longest],start1,start2

 

最長子序列:若對應位置字元相同,則c[i][j] = c[i-1][j-1] + 1,若不同,則max(c[i][j-1],c[i-1][j]).

 

 

 1 def printLcs(flag,a,i,j):      2     if i==0 or j==0:   3         return   4     if flag[i][j]==‘OK‘:   5         printLcs(flag,a,i-1,j-1)   6         print a[i-1], 7     elif flag[i][j]==‘Left‘:   8         printLcs(flag,a,i,j-1)   9     else:  10         printLcs(flag,a,i-1,j)  11 12 def longSubSeq(str1,str2):13     len1 = len(str1)14     len2 = len(str2)15     longest = 016     c = [[0 for i in range(len2+1)]for i in range(len1+1)]17     flag = [[0 for i in range(len2+1)]for i in range(len1+1)]  18     for i in range(len1+1):19         for j in range(len2+1):20             if i == 0 or j == 0:21                 c[i][j] = 022             elif str1[i-1] == str2[j-1]:23                 c[i][j] = c[i-1][j-1]+1 24                 flag[i][j] = ‘OK‘25                 longest = max(longest,c[i][j])              26             elif c[i][j-1] > c[i-1][j]:27                 c[i][j] =c[i][j-1]28                 flag[i][j] = ‘Left‘29             else:30                 c[i][j] =c[i-1][j]31                 flag[i][j] = ‘UP‘32     printLcs(flag,str1,len1,len2)       33     return longest34 a=‘ABCBDAB‘  35 b=‘BDCABA‘  36 print longSubSeq(a,b)

 

最長公用子串和子序列的Python實現,帶圖示。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.