最长公共子序列问题(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实现的主要内容,如果未能解决你的问题,请参考以下文章