最長公共子序列問題(LCS)——Python實現


# 最長公共子序列問題
# 作用:求兩個序列的最長公共子序列
# 輸入:兩個字符串數組:A和B
# 輸出:最長公共子序列的長度和序列
 
def LCS(A,B): print('輸入字符串數組A',A) print('輸入字符串數組B',B);print('\n') n = len(A) m = len(B) # 在字符串數組A、B之前插入字符0,目的是使后面下標統一
    A.insert(0,'0') B.insert(0,'0') # 二維表L存放公共子序列的長度
    L = [ ([0]*(m+1)) for i in range(n+1) ] # 二維表C存放公共子序列的長度步進
    C = [ ([0]*(m+1)) for i in range(n+1) ] for x in range (0,n+1): for y in range (0,m+1): if (x==0 or y==0): L[x][y] = 0 elif A[x] == B[y]: L[x][y] = ( L[x-1][y-1] + 1 ) C[x][y] = 0 elif L[x-1][y] >= L[x][y-1]: L[x][y] = L[x-1][y] C[x][y] = 1
            else: L[x][y] = L[x][y-1] C[x][y] = -1
                
        print('二維表行標:',x) print(L[x]) print('\n');print('公共子序列長度二維表:');print (L) print('\n');print('公共子序列長度步進表:');print (C);print('\n') return L[n][m],C,n,m

其中返回的 L[n][m] 就是最長公共子序列的長度,以下打印序列:

def printLCS(C,A,x,y):
       
    if ( x == 0 or y == 0):
        return 0  
    if C[x][y] == 0:
        printLCS(C,A,x-1,y-1)
        print (A[x])
    elif C[x][y] == 1:
         printLCS(C,A,x-1,y)
    else:
        printLCS(C,A,x,y-1)

輸入字符串數組A、B並進行函數調用:

A = ['z', 'x', 'y', 'x', 'y', 'z']
B = ['x', 'y', 'y', 'z', 'x']
length,C,x,y = LCS(A,B)
print('最長公共子序列長度為:',length)
print('最長公共子序列為:')
printLCS(C,A,x,y)

運行結果:

二維表行標: 0
[0, 0, 0, 0, 0, 0]
二維表行標: 1
[0, 0, 0, 0, 1, 1]
二維表行標: 2
[0, 1, 1, 1, 1, 2]
二維表行標: 3
[0, 1, 2, 2, 2, 2]
二維表行標: 4
[0, 1, 2, 2, 2, 3]
二維表行標: 5
[0, 1, 2, 3, 3, 3]
二維表行標: 6
[0, 1, 2, 3, 4, 4]


公共子序列長度二維表:
[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 1], [0, 1, 1, 1, 1, 2], [0, 1, 2, 2, 2, 2], [0, 1, 2, 2, 2, 3], [0, 1, 2, 3, 3, 3], [0, 1, 2, 3, 4, 4]]


公共子序列長度步進表:
[[0, 0, 0, 0, 0, 0], [0, 1, 1, 1, 0, -1], [0, 0, -1, -1, 1, 0], [0, 1, 0, 0, -1, 1], [0, 0, 1, 1, 1, 0], [0, 1, 0, 0, -1, 1], [0, 1, 1, 1, 0, -1]]


最長公共子序列長度為: 4
最長公共子序列為:
x
y
y
z

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM