(51Nod1006):最长公共子序列Lcs
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:
abcicba
abdkscab
ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
'''求不连续的最长公共子序列'''
def longest_common_subsequence(A, B):
len_a = len(A)
len_b = len(B)
dp = [[0] * (len_b+1) for _ in range(len_a+1)]
#动态规划
for i in range(1, len_a+1):
for j in range(1, len_b+1):
if A[i-1] == B[j-1]:
dp[i][j] = dp[i-1][j-1] + 1
else:
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
print(dp)
#从dp数组中反推最长公共子序列
lcs = []
while len_a > 0 and len_b > 0:
if A[len_a-1] == B[len_b-1]:
lcs.append(A[len_a-1])
len_a -= 1
len_b -= 1
#哪边大,最长子序列就是走的哪边
elif dp[len_a -1][j] > dp[len_a][len_b-1]:
len_a -= 1
else:
len_b -= 1
return ''.join(lcs[::-1])
A = input()
B = input()
print(longest_common_subsequence(A, B))