'''
解题思路:
动态规划算法,
dp[i][j]定义为:str1在索引i处及之前位置,str2在索引j处及之前位置,存在公共子序列的最大长度
需要回溯取依据取公共子序列字符
1、当i==0 | j==0:
(a)当str1[i] == str2[j],dp[i][j] = 1
(b)当str1[i] != str2[j],dp[i][j] = max(dp[i-1][j], dp[i][j-1])
2、其它情况:
(c)当str1[i] == str2[j],dp[i][j] = dp[i-1][j-1] + 1
(d)当str1[i] != str2[j],dp[i][j] = max(dp[i-1][j], dp[i][j-1])
#=============================================================================================
'''
#
# @param str1 string字符串 the string
# @param str2 string字符串 the string
# @return string字符串
#
class Solution:
def LCS(self , str1 , str2 ):
# write code here
if str1 == '' or str2 == '':
return '-1'
r = len(str1)
c = len(str2)
dp = [[0]*(c+1) for _ in range(r+1)]
for i in range(1,1+r):
for j in range(1,1+c):
if (i==1 or j==1):
#print('A--',i,j)
if str1[i-1]==str2[j-1]:
dp[i][j] = 1
else:
dp[i][j] = max(dp[i][j-1],dp[i-1][j])
else:
#print('B--',i,j)
if str1[i-1]==str2[j-1]:
dp[i][j] = dp[i-1][j-1]+1
else:
dp[i][j] = max(dp[i][j-1],dp[i-1][j])
#for i in dp:
# print(i)
i = r
j = c
substr = ''
while i>=1 and j>=1:
if str1[i-1]==str2[j-1]:
substr += str1[i-1]
i -= 1
j -= 1
else:
if dp[i-1][j]>dp[i][j-1]:
i -= 1
else:
j -= 1
#print(substr[::-1])
if substr != '':
return substr[::-1]
else:
return '-1'
str1 = '1A2C3D4B56'
str2 = 'B1D23A456A'
s = Solution()
print(s.LCS(str1,str2)) # 123456