当前位置:实例文章 » 其他实例» [文章]代码随想录第53天|1143.最长公共子序列, 1035.不相交的线,53. 最大子序和

代码随想录第53天|1143.最长公共子序列, 1035.不相交的线,53. 最大子序和

发布人:shili8 发布时间:2025-01-24 01:21 阅读次数:0

**代码随想录第53天**

**1143. 最长公共子序列**

今天,我们来讨论一个经典的问题:最长公共子序列(Longest Common Subsequence,LCS)。这个问题是计算两个字符串的最长公共子序列。

**1035. 不相交的线**

接着,我们会讨论一个与图论相关的问题:不相交的线。这个问题是求出在一个点集上画出的不相交线段的最大数量。

**53. 最大子序和**

最后,我们会讨论一个经典的动态规划问题:最大子序和。这个问题是求出一个数组中连续子数组的最大和。

###1143. 最长公共子序列#### 题目描述给定两个字符串 `s1` 和 `s2`,请找到它们的最长公共子序列(LCS)。

#### 示例* 输入:`s1 = "abcde", s2 = "ace"`
输出: `"a c e"`
* 输入:`s1 = "abc", s2 = "def"`
输出: `""`

#### 思路我们可以使用动态规划来解决这个问题。我们首先定义一个2D 数组 `dp`,其中 `dp[i][j]` 表示 `s1[0..i-1]` 和 `s2[0..j-1]` 的最长公共子序列的长度。

####代码

def longestCommonSubsequence(s1, s2):
 m, n = len(s1), len(s2)
 # Initialize dp array dp = [[0] * (n +1) for _ in range(m +1)]
 # Fill up the dp array 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] +1 else:
 dp[i][j] = max(dp[i -1][j], dp[i][j -1])
 # Reconstruct the LCS from the dp array lcs = []
 i, j = m, n 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 # Return the LCS in the correct order return "".join(reversed(lcs))


###1035. 不相交的线#### 题目描述给定一个点集 `points`,请找到在这个点集上画出的不相交线段的最大数量。

#### 示例* 输入:`points = [[1,1],[2,2],[3,3]]`
输出: `3`

#### 思路我们可以使用贪婪算法来解决这个问题。我们首先将所有点按照 x 坐标排序,然后遍历每个点,将其作为线段的起始点。

####代码
def maxUncrossedLines(points):
 n = len(points)
 # Initialize dp array dp = [[0] * (n +1) for _ in range(n +1)]
 # Fill up the dp array for i in range(1, n +1):
 for j in range(i, n +1):
 if points[i -1][0] == points[j -1][0]:
 dp[i][j] = max(dp[i -1][j], dp[i][j -1]) +1 else:
 dp[i][j] = max(dp[i -1][j], dp[i][j -1])
 # Return the maximum number of non-intersecting lines return dp[n][n]


###53. 最大子序和#### 题目描述给定一个数组 `nums`,请找到其中的最大子序和。

#### 示例* 输入:`nums = [-2,1,-3,4,-1,2,1,-5,4]`
输出: `6`

#### 思法我们可以使用动态规划来解决这个问题。我们首先定义一个1D 数组 `dp`,其中 `dp[i]` 表示前 i 个数字的最大子序和。

####代码
def maxSubarraySum(nums):
 n = len(nums)
 # Initialize dp array dp = [0] * (n +1)
 # Fill up the dp array for i in range(1, n +1):
 if nums[i -1] > dp[i -1]:
 dp[i] = nums[i -1]
 else:
 dp[i] = dp[i -1] + nums[i -1]
 # Return the maximum subarray sum return max(dp)


以上就是本篇文章的全部内容。我们分别讨论了最长公共子序列、不相交的线和最大子序和三个问题,并给出了解决方案。

其他信息

其他资源

Top