Day 49 卡玛笔记

这是基于代码随想录的每日打卡

1143. 最长公共子序列

给定两个字符串 text1text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0

一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。

  • 例如,"ace""abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。

两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。

示例 1:

复制代码
输入:text1 = "abcde", text2 = "ace" 
输出:3  
解释:最长公共子序列是 "ace" ,它的长度为 3 。

示例 2:

复制代码
输入:text1 = "abc", text2 = "abc"
输出:3
解释:最长公共子序列是 "abc" ,它的长度为 3 。

示例 3:

复制代码
输入:text1 = "abc", text2 = "def"
输出:0
解释:两个字符串没有公共子序列,返回 0 。

动态规划

python 复制代码
class Solution:
    def longestCommonSubsequence(self, text1: str, text2: str) -> int:
        dp=[[0 for j in range(len(text2)+1)] for i in range(len(text1)+1)]

        # i和j表示的都是第几个字符  
        for i in range(1,len(text1)+1):
            for j in range(1,len(text2)+1):
                if text1[i-1]==text2[j-1]:
                    dp[i][j]=dp[i-1][j-1]+1
                else:
                    # 当前字符不匹配,表示跳过text1的当前字符,寻找text1前一个字符和text2的最长公共子序列;跳过text2的当前字符,寻找text2前一个字符和text1的最长公共子序列
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1])
        return dp[-1][-1]

运行结果


1035. 不相交的线

在两条独立的水平线上按给定的顺序写下 nums1nums2 中的整数。

现在,可以绘制一些连接两个数字 nums1[i]nums2[j] 的直线,这些直线需要同时满足:

  • nums1[i] == nums2[j]
  • 且绘制的直线不与任何其他连线(非水平线)相交。

请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。

以这种方法绘制线条,并返回可以绘制的最大连线数。

示例 1:

复制代码
输入:nums1 = [1,4,2], nums2 = [1,2,4]
输出:2
解释:可以画出两条不交叉的线,如上图所示。 
但无法画出第三条不相交的直线,因为从 nums1[1]=4 到 nums2[2]=4 的直线将与从 nums1[2]=2 到 nums2[1]=2 的直线相交。

示例 2:

复制代码
输入:nums1 = [2,5,1,2,5], nums2 = [10,5,2,1,5,2]
输出:3

示例 3:

复制代码
输入:nums1 = [1,3,7,1,7,5], nums2 = [1,9,2,5,1]
输出:2

动态规划

python 复制代码
class Solution:
    def maxUncrossedLines(self, nums1: List[int], nums2: List[int]) -> int:
        # 本质是上一题的求最长公共子序列问题
        dp=[[0 for j in range(len(nums2)+1)] for i in range(len(nums1)+1)]

        # i和j表示的都是第几个字符  
        for i in range(1,len(nums1)+1):
            for j in range(1,len(nums2)+1):
                if nums1[i-1]==nums2[j-1]:
                    dp[i][j]=dp[i-1][j-1]+1
                else:
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1])
        return dp[-1][-1]

运行结果


53. 最大子数组和

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。

示例 1:

复制代码
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例 2:

复制代码
输入:nums = [1]
输出:1

示例 3:

复制代码
输入:nums = [5,4,-1,7,8]
输出:23

动态规划

python 复制代码
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        # dp[i]表示以下标i为结尾的最大连续子数组和
        dp=[0 for i in range(len(nums))]
        dp[0]=nums[0]
        for i in range(1,len(nums)):
            dp[i]=max(dp[i-1]+nums[i],nums[i])
        return max(dp)

运行结果


392. 判断子序列

给定字符串 st ,判断 s 是否为 t 的子序列。

字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace""abcde"的一个子序列,而"aec"不是)。

示例 1:

复制代码
输入:s = "abc", t = "ahbgdc"
输出:true

示例 2:

复制代码
输入:s = "axc", t = "ahbgdc"
输出:false

动态规划

python 复制代码
class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        dp=[[0 for j in range(len(t)+1)] for i in range(len(s)+1)]

        # i和j表示的都是第几个字符  
        for i in range(1,len(s)+1):
            for j in range(1,len(t)+1):
                if s[i-1]==t[j-1]:
                    dp[i][j]=dp[i-1][j-1]+1
                else:
                    # 当字符不匹配时,我们只需要继承 t 的前 j-1 个字符的状态,
                    # 因为 s 的前 i 个字符是否是 t 的子序列,不依赖于 t 的当前字符。
                    dp[i][j]=dp[i][j-1]
        if dp[-1][-1]==len(s):
            return True
        return False

运行结果

相关推荐
230万光年的思念10 分钟前
【无标题】
python
2401_8384725114 分钟前
C++中的访问者模式
开发语言·c++·算法
shengli72216 分钟前
机器学习与人工智能
jvm·数据库·python
老鼠只爱大米19 分钟前
LeetCode经典算法面试题 #108:将有序数组转换为二叉搜索树(递归分治、迭代法等多种实现方案详解)
算法·leetcode·二叉树·二叉搜索树·平衡树·分治法
2301_7657031424 分钟前
Python迭代器(Iterator)揭秘:for循环背后的故事
jvm·数据库·python
追风少年ii44 分钟前
多组学扩展---分子对接pyrosetta
python·数据分析·空间·单细胞
独自破碎E1 小时前
【前缀和+哈希】LCR_011_连续数组
算法·哈希算法
一条大祥脚1 小时前
26.1.26 扫描线+数论|因子反演+子序列计数|树套树优化最短路
数据结构·算法
m0_561359671 小时前
基于C++的机器学习库开发
开发语言·c++·算法
2301_821369611 小时前
使用Python进行图像识别:CNN卷积神经网络实战
jvm·数据库·python