题解 | #最长公共子序列(二)#

最长公共子序列(二)

https://www.nowcoder.com/practice/6d29638c85bb4ffd80c020fe244baf11

class Solution:
    def LCS(self , s1: str, s2: str) -> str:
		# 获取最长公共子序列长度
        dp = [[0]*(len(s2)+1) for _ 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][j-1], dp[i-1][j])

		# 获取字符串
        res = ""
        i = len(s1)
        j = len(s2)
        while i > 0 and j > 0:
            if s1[i-1] == s2[j-1]: # 对角
                res += s1[i-1]
                i -= 1
                j -= 1
            elif dp[i][j-1] > dp[i-1][j]: # 上大于左
                j -= 1
            else: # 左大于上
                i -= 1
        
        if not res:
            return -1
        
        return res[::-1]

解题思路

1.先利用动态规划获取最长子序列的长度:

  • 如果当两个字符串的元素相等的时候,状态转移方程为:dp[i][j] = dp[i-1][j-1] + 1;
  • 否则为dp[i][j] = max(dp[i][j-1], dp[i-1][j])。

2.根据第一步,从后往前获取字符,得到最长子序列的字符串结果。

复杂度

时间复杂度和空间复杂度都为O(mn)。

全部评论

相关推荐

04-17 18:32
门头沟学院 Java
野猪不是猪🐗:他跟你一个学校,你要是进来之后待遇比他好,他受得了?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务