最长公共子序列问题是在两个序列中找到最长公共子序列的问题。下面是三种不同的Python实现,用于解决最长公共子序列问题。
动态规划解决方法是将问题分解为一系列子问题,并在这些子问题上进行递归求解。下面是Python实现:
def lcs_dp(s1, s2):
m = len(s1)
n = len(s2)
l = [[None]*(n + 1) for i in range(m + 1)]
for i in range(m + 1):
for j in range(n + 1):
if i == 0 or j == 0:
l[i][j] = 0
elif s1[i-1] == s2[j-1]:
l[i][j] = l[i-1][j-1] + 1
else:
l[i][j] = max(l[i-1][j], l[i][j-1])
index = l[m][n]
lcs = [""] * (index+1)
lcs[index] = ""
i = m
j = n
while i > 0 and j > 0:
if s1[i-1] == s2[j-1]:
lcs[index-1] = s1[i-1]
i -= 1
j -= 1
index -= 1
elif l[i-1][j] > l[i][j-1]:
i -= 1
else:
j -= 1
return "".join(lcs)
递归解决方法是将问题递归分解为更小的子问题,直到问题大小足够小,可以直接解决。下面是Python实现:
def lcs_rec(s1, s2,