题目描述
给定两个字符串str1和str2,输出两个字符串的最长公共子序列。如果最长公共子序列为空,则返回"-1"。目前给出的数据,仅仅会存在一个最长的公共子序列。
示例1
输入: “1A2C3D4B56”,“B1D23A456A”
输出: “123456”
示例2
输入: “abc”,“def”
输出:"-1"
示例3
输入: “abc”,“abc”
输出: “abc”
题解:动态规划算法,dp[i][j]定义为:str1在索引i处及之前的位置,str2在索引j处及之前的位置,存在公共子序列的最大长度
需要回溯取依据取公共子序列字符
状态转移方程为:如果s1[i - 1] == s2[j - 1],则dp[i][j] = dp[i - 1][j - 1] + s2[j - 1]
如果s1[i - 1] != s2[j - 1], 则dp[i][j]为dp[i - 1][j]和dp[i][j - 1]中字符串长度最长的那个
最后返回dp[m][n]
'''
class Solution:
def LCS(self , s1 , s2 ):
# write code here
m, n = len(s1), len(s2)
dp = [['' for _ in range(n + 1)] for _ in range(m + 1)]
for i in range(1, m + 1):
for j in range(1, n + 1):
if s1[i - 1] == s2[j - 1]:
dp[i][j] = dp[i - 1][j - 1] + s2[j - 1]
print("dp[i][j]:", dp[i][j])
else:
if len(dp[i][j - 1]) > len(dp[i - 1][j]):
dp[i][j] = dp[i][j - 1]
else:
dp[i][j] = dp[i - 1][j]
if not dp[m][n]:
return ("-1")
return dp[m][n]