首页 > 其他分享 >代码随想录day44 || 1143 最长公共子序列, 1035 不相交的线, 53 最大子序列和, 392 判断子序列

代码随想录day44 || 1143 最长公共子序列, 1035 不相交的线, 53 最大子序列和, 392 判断子序列

时间:2024-08-29 11:15:49浏览次数:4  
标签:1143 nums int 随想录 len var maxCount 序列 dp

1143 最长公共子序列

func longestCommonSubsequence(text1 string, text2 string) int {
	// 思路和判断最长公共数组一样
	// dp[i][j] 表示以text1[i], text2[j]为结尾的最长公共子序列的长度
	// if text1[i] == text2[j] {dp[i+1][j+1] = dp[i][j] + 1} else {dp[i+1][j+1] = max(dp[i][j+1], dp[i+1][j])}
	// 初始化多一行一列表示0
	// print

	var maxCount int
	var dp = make([][]int, len(text1) + 1)
	for idx, _ := range dp {
		dp[idx] = make([]int, len(text2) + 1)
	}

	for i:=0; i<len(text1); i++ {
		for j:=0; j<len(text2); j++{
			if text1[i] == text2[j] {
				dp[i+1][j+1] = dp[i][j] + 1
			} else {
				dp[i+1][j+1] = max(dp[i][j+1], dp[i+1][j])
			}
			if dp[i+1][j+1] > maxCount{
				maxCount = dp[i+1][j+1]
			}
		}
	}
	//fmt.Println(dp)
	return maxCount
}

// 理解递推公式,本身dp[i][j] 已经是之前和之左最大值情况了,所以,不应该考虑使用遍历然后,取最大值来作为递推公式

1035 不相交的线

func maxUncrossedLines(nums1 []int, nums2 []int) int {
	// 难点在于能不能想到本题就是最长公共子序列?
	
	var maxCount int
	var dp = make([][]int, len(nums1) + 1)
	for idx, _ := range dp {
		dp[idx] = make([]int, len(nums2) + 1)
	}

	for i:=0; i<len(nums1); i++ {
		for j:=0; j<len(nums2); j++{
			if nums1[i] == nums2[j] {
				dp[i+1][j+1] = dp[i][j] + 1
			} else {
				dp[i+1][j+1] = max(dp[i][j+1], dp[i+1][j])
			}
			if dp[i+1][j+1] > maxCount{
				maxCount = dp[i+1][j+1]
			}
		}
	}
	//fmt.Println(dp)
	return maxCount
}

最大子序列和

func maxSubArray(nums []int) int {
	// 贪心的思路,分别存储连续和以及最大和,连续和不断贪心往后累加,如果大于最大和就更新最大和
	// 连续和更新逻辑,如果目前大于0,往后累加,如果小于0,舍弃,直接等于当前元素

	//var sum, maxsum int
	//maxsum = math.MinInt
	//for _, v := range nums {
	//	if sum >= 0 {
	//		sum += v
	//	}else {
	//		sum = v
	//	}
	//
	//	if sum > maxsum {
	//		maxsum = sum
	//	}
	//}
	//return maxsum

	// 动态规划的思路,本题要求最大和,dp[i] 就定义为到nums[i-1]为止的最大子序和
	// 递推公式,
	//		if dp[i-1] > 0  { // 如果前面连续和大于0 对下一个有增加所用,增加
	//			dp[i] = dp[i-1] + nums[i]
	//		}else {
	//			dp[i] = nums[i]
	//		}
	// 初始化dp[0] = nums[0]
	// 遍历数组
	// print
	var dp = make([]int, len(nums))
	dp[0] = nums[0]
	var maxSum = dp[0]

	for i:=1; i<len(nums); i++ {
		if dp[i-1] > 0  { // 如果前面连续和大于0 对下一个有增加所用,增加
			dp[i] = dp[i-1] + nums[i]
		}else {
			dp[i] = nums[i]
		}
		if dp[i] > maxSum{
			maxSum = dp[i]
		}
	}
	fmt.Println(dp)
	return maxSum
}

判断子序列

func isSubsequence(s string, t string) bool {
	// 最简单思路直接hash表计算了,但是我偏要用动规, 思路大概是判断最长公共字串长度是不是等于len(s), 剪枝情况大概是一次遍历没出现
	// dp[i][j] 表示s[i], t[j] 结尾最长字串长度
	// if s[i] == t[j] {dp[i][j] = dp[i-1][j-1] + 1} else {dp[i][j] = max(dp[i-1][j], dp[i][j-1])}
	// 多初始化一行一列
	// print
	if len(s) > len(t) {
		return false
	}
	var maxCount = 0
	var dp = make([][]int, len(s) + 1)
	for idx, _ := range dp {
		dp[idx] = make([]int, len(t) + 1)
	}

	for i:=0; i<len(s); i++ {
		var flag bool
		for j:=0; j<len(t); j++ {
			if s[i] == t[j] {
				flag = true
				dp[i+1][j+1] = dp[i][j] + 1
			}else {
				dp[i+1][j+1] = max(dp[i][j+1], dp[i+1][j])
			}

			if dp[i+1][j+1] > maxCount {
				maxCount = dp[i+1][j+1]
			}
		}
		if !flag{
			return false
		}
	}
	//fmt.Println(dp)
	if maxCount == len(s){
		return true
	}
	return false
}

标签:1143,nums,int,随想录,len,var,maxCount,序列,dp
From: https://www.cnblogs.com/zhougongjin55/p/18386295

相关文章

  • 代码随想录算法训练营第四十三天 | 300.最长递增子序列 , 674. 最长连续递增序列 , 718.
    目录300.最长递增子序列 思路1.dp[i]的定义2.状态转移方程3.dp[i]的初始化4.确定遍历顺序 5.举例推导dp数组方法一:动态规划方法二:贪心心得收获 674.最长连续递增序列思路动态规划1.确定dp数组(dptable)以及下标的含义2.确定递推公式3.dp数组如何初始化4.......
  • NLP从零开始------15.文本中阶序列处理之语言模型(3)
    4. 注意力机制4.1 注意力机制        循环神经网络的一个主要局限是不能很好地建模长距离依赖,即使像长短期记忆这样的变体也只是改善而不是完全解决了长距离依赖的问题。其根本原因在于,如果序列中的第i个词需要对第j个词(假设j>i)产生影响,需经过j-i个计算步骤, 而......
  • 代码随想录算法训练营第二十九天(贪心 三)
    力扣题部分:134.加油站题目链接:.-力扣(LeetCode)题面:在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为......
  • [深度学习] 时间序列分析工具TSLiB库使用指北
    TSLiB是一个为深度学习时间序列分析量身打造的开源仓库。它提供了多种深度时间序列模型的统一实现,方便研究人员评估现有模型或开发定制模型。TSLiB涵盖了长时预测(Long-termforecasting)、短时预测(Short-termforecasting)、缺失值填补(Missingvalueimputation)、异常检测(Anomalyde......
  • 代码随想录 -- 哈希表 -- 四数之和
    18.四数之和-力扣(LeetCode)思路:(与三数之和类似,在外面加一层循环)    1. 先将nums 按升序排序    2. 初始状态:k=0,i= k+1,left= i+1,right= len(nums)-1        3. 进入第一层for循环:        如果 nums[k]>0andtarget>0 ......
  • 代码随想录算法day1-数组1
    题目1704.二分查找题目描述:给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4示例2:......
  • thinkPHP6 反序列化
    thinkPHP6反序列化thinkPHPv6.0.0-6.0.3环境搭建新版v6基于PHP7.1+开发php-7.3.4ThinkPHPv6.0.3使用composer进行安装composercreate-projecttopthink/think=6.0.3tp6.0然后利用phpstudy打开框架,简单配置如下子,再同样的道理配置phpstorm的调试。但是万事......
  • 序列化;RPC 【2024年8月28日随笔】
    序列化什么是序列化序列化:把对象转化为可传输的字节序列过程称为序列化反序列化:把字节序列还原为对象的过程称为反序列化为什么序列化序列化机制允许将实现序列化的Java对象转换位字节序列,这些字节序列可以保存在磁盘上,或通过网络传输,以达到以后恢复成原来的对象。序列化机......
  • 代码随想录算法训练营第一天 | 数组part01:数组理论基础,704. 二分查找,27. 移除元素 97
    数组理论基础数组是存放在连续内存空间上的相同类型数据的集合数组徐璈注意的是:数组的下标都是从0开始的数组内存空间是的地址是连续的正因为舒适的内存空间是连续的,所以在删除和增添元素的时候,需要移动其他元素的地址。在c++中,vector的底层实现是array,严格来说,vector是容......
  • 给自己复盘的随想录笔记-链表练习题(在整理ing)
    删除链表的倒数第N个节点双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。思路是这样的,但要注意一些细节。分为如下几步:推荐大家使用虚拟头结点,这样方便处理删除实际头结点的逻辑,定......