描述
给定两个字符串str1和str2,输出两个字符串的最长公共子序列。如果最长公共子序列为空,则返回"-1"。目前给出的数据,仅仅会存在一个最长的公共子序列。
示例1
输入:
“1A2C3D4B56”,“B1D23A456A”
返回值:
“123456”
示例2
输入:
“abc”,“def”
返回值:
“-1”
示例3
输入:
“abc”,“abc”
返回值:
“abc”
class Solution:
def ans(self,i,j,b,s1,dp):
res =""
while i != 0 and j != 0:
if b[i][j] == 1:
if dp[i-1][j-1]!=dp[i][j]:
res=res+s1[j-1]
i=i-1
j=j-1
elif b[i][j] == 2:
if dp[i-1][j]!=dp[i][j]:
res=res+s1[j-1]
i=i-1
elif b[i][j] == 3:
if dp[i][j-1]!=dp[i][j]:
res=res+s1[j-1]
j=j-1
return res[::-1]
def LCS(self , s1 , s2 ):
M=len(s1)
N=len(s2)
dp=[[0 for i in range(M+1)]for j in range(N+1)]
b=[[0 for i in range(M+1)]for j in range(N+1)]
for i in range(1,N+1):
for j in range(1,M+1):
if s1[j-1]==s2[i-1]:
dp[i][j]=dp[i-1][j-1]+1
b[i][j]=1#来自于左上方
else:
if dp[i-1][j]>dp[i][j-1]:
dp[i][j]=dp[i-1][j]
b[i][j]=2#来自于上方
else:
dp[i][j]=dp[i][j-1]
b[i][j]=3#来源于左方
return self.ans(N,M,b,s1,dp) if self.ans(N,M,b,s1,dp) else '-1'