# coding=utf-8
# 计算LCS长度算法
# 算法导论课本 动态规划 LCS 代码示例
# LCS 根据伪码 使用 python实现
def lcsLength(x,y):
m = len(x) + 1
n = len(y) + 1
# 存放箭头方向
b = [[0 for i in range(n)] for j in range(m)]
# 存放数值
c = [[0 for i in range(n)] for j in range(m)]
# 已经全部初始化为 0 了 上↑ 左← 左上↖
for i in range(1, m):
for j in range(1, n):
# 数组第一个 元素 下标为 0
if x[i-1] == y[j-1]:
c[i][j] = c[i-1][j-1] + 1;
b[i][j] = '↖'
elif c[i-1][j] >= c[i][j-1]:
c[i][j] = c[i-1][j]
b[i][j] = '↑'
else:
c[i][j] = c[i][j-1]
b[i][j] = '←'
return c, b
# 打印 x 和 y 的一个LCS
def printLcs(b, x, i, j):
if i == 0 or j == 0:
return
if b[i][j] == '↖':
printLcs(b, x, i - 1, j-1)
print(x[i-1],end='')
elif b[i][j] == '↑':
printLcs(b, x, i-1, j)
else:
printLcs(b, x, i, j-1)
x = ['A', 'B', 'C', 'B', 'D', 'A', 'B']
y = ['B', 'D', 'C', 'A', 'B', 'A']
c, b = lcsLength(x, y)
print("其最长公共子序列长度为:", c[len(x)][len(y)])
print("其最长公共子序列为:")
printLcs(b, x, len(x), len(y))