![]()
![]()
![]()
查看代码
def lcs_length(x, y):
m = len(x)
n = len(y)
c = [[0 for _ in range(n + 1)] for _ in range(m + 1)]
for i in range(1, m + 1):
for j in range(1, n + 1):
if x[i - 1] == y[j - 1]: # i j 位置上的字符串匹配的时候,来自于左上方+1
c[i][j] = c[i - 1][j - 1] + 1
else:
c[i][j] = max(c[i - 1][j], c[i][j - 1])
# for _ in c:
# print(_)
return c[m][n] # 返回lcs长度
def lcs(x, y):
m = len(x)
n = len(y)
c = [[0 for _ in range(n + 1)] for _ in range(m + 1)]
b = [[0 for _ in range(n + 1)] for _ in range(m + 1)] # 1 左上方 2 上方 3 左方
for i in range(1, m + 1):
for j in range(1, n + 1):
if x[i - 1] == y[j - 1]: # i j 位置上的字符串匹配的时候,来自于左上方+1
c[i][j] = c[i - 1][j - 1] + 1
b[i][j] = 1
elif c[i - 1][j] >= c[i][j - 1]: # 来自上方
c[i][j] = c[i - 1][j]
b[i][j] = 2
else:
c[i][j] = c[i][j - 1]
b[i][j] = 3
return c[m][n], b # 返回lcs长度,和lcs对应表
def lcs_trackback(x, y):
# 从lcs对应表回溯,取值
c, b = lcs(x, y)
i = len(x)
j = len(y)
res = []
while i > 0 and j > 0:
if b[i][j] == 1:
res.append(x[i - 1])
i -= 1
j -= 1
elif b[i][j] == 2:
i -= 1
else:
j -= 1
return "".join(reversed(res)) # 因为回溯是倒序,所以将其倒序返值
print(lcs_trackback("ABCBDAB", "BDCABA"))