此类题目如果只需要求解最长公共子序列的长度,那么只需要掌握状态转移方程即可,若题目要求给出公共子序列,那么就要涉及到回溯的问题,跟背包问题的回溯差不多,其实难度不大,依着状态转移方程往前推即可。
暂时先给代码,后续来更新思路(技巧)~
给大家几个评测用例:
输入: AB34C A1BC2 输出: ABC 输入: 3563243 513141 输出: 534 输入: 3069248 513164318 输出: 3648
s1 = '3069248'
s2 = '513164318'
dp = [[0 for i in range(len(s2)+1)] for j in range(len(s1)+1)]
for i in range(1,len(s1)+1):
for j in range(1,len(s2)+1):
if s1[i-1] == s2[j-1]:
dp[i][j] = dp[i-1][j-1] + 1
else:
dp[i][j] = max(dp[i-1][j],dp[i][j-1])
row,col = len(s1),len(s2)
s = [] #这里也可以用个空字符串然后直接反转
while row > 0 and col > 0:
if s1[row-1] == s2[col-1]:
if dp[row][col] == dp[row-1][col-1] + 1 :
s.insert(0,s1[row-1]) #要插在最前面
row -= 1
col -= 1
else:
if dp[row-1][col] > dp[row][col-1]:
row -= 1
else:
col -= 1
print("".join(s))