#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# longest common subsequence
# @param s1 string字符串 the string
# @param s2 string字符串 the string
# @return string字符串
#
class Solution:
def LCS(self , s1: str, s2: str) -> str:
# write code here
n=len(s1)
m=len(s2)
#定义dp[i][j] 表示 s1[0 ,i-1] s[0,j-1] 的最长
dp=[[0] * (m+1) for _ in range(n+1)]
for i in range(1,n+1):
for j in range(1,m+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])
if dp[n][m]==0: # 没有公共子序列
return "-1"
#print(dp)
i,j=n,m
lcs=[]
while i>0 and j>0:
if s1[i-1]==s2[j-1]:
lcs.append(s1[i-1])
i-=1
j-=1
elif dp[i-1][j]>dp[i][j-1]:
i-=1
else:
j-=1
print(dp)
return "".join(lcs[::-1])