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

最长公共子序列(二)

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)。

全部评论

相关推荐

05-12 17:00
门头沟学院 Java
king122:你的项目描述至少要分点呀,要实习的话,你的描述可以使用什么技术,实现了什么难点,达成了哪些数字指标,这个数字指标尽量是真实的,这样面试应该会多很多,就这样自己包装一下,包装不好可以找我,我有几个大厂最近做过的实习项目也可以包装一下
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务