最长公共子序列问题(LCS)——Python实现

Posted 点灯非烛伊丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最长公共子序列问题(LCS)——Python实现相关的知识,希望对你有一定的参考价值。

# 最长公共子序列问题
# 作用:求两个序列的最长公共子序列
# 输入:两个字符串数组:A和B
# 输出:最长公共子序列的长度和序列
 
def LCS(A,B):

    print(输入字符串数组A,A)
    print(输入字符串数组B,B);print(
)
    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(
);print(公共子序列长度二维表:);print (L)
    print(
);print(公共子序列长度步进表:);print (C);print(
)
    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

 

 

 

 

 

以上是关于最长公共子序列问题(LCS)——Python实现的主要内容,如果未能解决你的问题,请参考以下文章

51nod 1006 最长公共子序列Lcs(dp+string,无标记数组实现)

最长公共子序列(LCS)

最长公共子序列(LCS)和逆LCS问题求解

最长公共子序列(LCS)

最长公共子串和最长公共子序列(LCS问题)

最长公共子串和最长公共子序列(LCS问题)