首页 > 其他分享 >代码随想录day45 || 115 不同子序列, 583 两个字符串删除操作, 72 编辑距离

代码随想录day45 || 115 不同子序列, 583 两个字符串删除操作, 72 编辑距离

时间:2024-08-30 11:27:06浏览次数:4  
标签:583 int 随想录 len 115 word1 word2 dp string

115 不同子序列

image

func numDistinct(s string, t string) int {
	// 动态规划,思考一下判断连续和不连续的区别,如果相等都是左上角+1, 如果不等,连续情况就是直接等于左上角,不连续情况直接归零
	// dp[i][j] 表示s[i] 中存在 t[j] 结尾的的个数
	// 递推公式,不要求连续字串,所以,如果s[i] != t[j] {dp[i][j] = dp[i-1][j]} else {dp[i][j] = dp[i-1][j-1]+dp[i-1][j]}
	// 多初始化一行一列 dp[0][0] = 1  dp[0][j] = 0  dp[i][0] = 1
	// print

	if len(t) > len(s) {
		return 0
	}

	var dp = make([][]int, len(s) + 1)
	for idx, _ := range dp {
		dp[idx] = make([]int, len(t) + 1)
		dp[idx][0] = 1
	}

	for i:=0; i<len(s); i++ {
		for j:=0; j<len(t); j++{
			if s[i] == t[j] {
				dp[i+1][j+1] = dp[i][j] + dp[i][j+1]
			}else {
				dp[i+1][j+1] = dp[i][j+1]
			}
		}
	}
	//fmt.Println(dp)
	return dp[len(s)][len(t)]
}

583 两个字符串删除操作

func minDistance(word1 string, word2 string) int {
	// 两种解题思路,第一种取巧,求两个字串的最长公共子序列,然后两个长度相加-公共*2 = 操作步数
	// 正常思路比较难
	// dp[i][j] 表示word1[i]结尾到word2[j]结尾相同需要删除的次数
	// if word1[i] == word2[j] {dp[i][j] = dp[i-1][j-1]} else {dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1]+2)}
	// dp[i][0] = i  dp[0][j] = j
	// 正序遍历word1,正序word2
	// print

	var dp = make([][]int, len(word1) + 1)
	for i, _ := range dp {
		dp[i] = make([]int, len(word2) + 1)
		dp[i][0] = i
		if i == 0 {
			for j, _ := range dp[0] {
				dp[0][j] = j
			}
		}
	}

	for i:=0; i<len(word1); i++ {
		for j:=0; j<len(word2); j++{
			if word1[i] == word2[j] { // 此时不需要删除
				dp[i+1][j+1] = dp[i][j]
			}else {
				// 1, 删除word1[i]
				up := dp[i][j+1] + 1
				// 2, 删除word2[j]
				left := dp[i+1][j] + 1
				// 3, 两个都删除, 其实这里情况要么等于第一种,要么等于第二种
				ul := dp[i][j] + 2
				fmt.Println(up, left, ul)
				dp[i+1][j+1] = min(up, min(left, ul))
			}
		}
	}
	//fmt.Println(dp)
	return dp[len(word1)][len(word2)]
}

72 编辑距离

func minDistance(word1 string, word2 string) int {
	// 思路,想比较于两个字串删除操作题目,此题操作更多,所以dp公式判断如果不等可能更加复杂
	// dp[i][j] 代表w1[i] 结尾 和w2[j] 结尾相同需要最小操作数量
	// if w1[i] == w2[j] {dp[i][j] = dp[i-1][j-1]} // 相等不需要操作
	// 不等, 1, 删除w1[i] dp[i-1][j]+1
	//       2, 删除w2[j] dp[i][j-1]+1
	//       3, 两个都删除 dp[i-1][j-1] + 2
	//       4, 替换任意一个,此时两个就相等了  dp[i-1][j-1] + 1
	//       5, w1插入一个w2[j], 此时就是同时删除两个w2[j], 所以是dp[i][j-1] + 1
	//       6, w2插入一个w1[i], 同理 dp[i-1][j] + 1
	// 总结 dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1]+1)

	// dp[0][j] = j  dp[i][0] = i
	// 根据dp定义进行遍历
	// print
	var dp = make([][]int, len(word1) + 1)
	for i, _ := range dp {
		dp[i] = make([]int, len(word2) + 1)
		dp[i][0] = i
		if i == 0 {
			for j, _ := range dp[0] {
				dp[0][j] = j
			}
		}
	}

	for i:=0; i<len(word1); i++ {
		for j:=0; j<len(word2); j++{
			if word1[i] == word2[j] { // 此时不需要删除
				dp[i+1][j+1] = dp[i][j]
			}else {
				dp[i+1][j+1] = min(dp[i][j+1] + 1, min(dp[i+1][j] + 1, dp[i][j] + 1))
			}
		}
	}
	//fmt.Println(dp)
	return dp[len(word1)][len(word2)]
}

标签:583,int,随想录,len,115,word1,word2,dp,string
From: https://www.cnblogs.com/zhougongjin55/p/18388375

相关文章

  • 代码随想录算法day3 - 链表1
    题目1203.移除链表元素给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例1:输入:head=[1,2,6,3,4,5,6],val=6输出:[1,2,3,4,5]示例2:输入:head=[],val=1输出:[]示例3:输入:head=[7,7,7,7],v......
  • 代码随想录算法训练营,29日 | 704. 二分查找,27. 移除元素,977.有序数组的平方,209.长度最
    数组基础文档讲解︰代码随想录(programmercarl.com)1.连续空间、相同类型元素2.元素只能覆盖3.二维数组的地址连续吗(C++连续,Java不连续)704.二分查找题目链接:704.二分查找文档讲解︰代码随想录(programmercarl.com)视频讲解︰二分查找日期:2024-08-29思路:第一反应是想到二分查......
  • 【Markdown笔记】设置字体颜色——转载https://blog.csdn.net/u012028275/article/det
     【Markdown笔记】设置字体颜色dadalaohua于2021-04-0517:53:19发布阅读量5.7w 收藏 293点赞数103分类专栏: Markdown笔记 文章标签: markdown latex html版权GitCode开源社区文章已被社区收录加入社区Markdown笔记专......
  • 代码随想录算法day2-数组2
    题目1209.长度最小的子数组给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其总和大于等于target的长度最小的子数组[numsl,numsl+1,...,numsr-1,numsr],并返回其长度。如果不存在符合条件的子数组,返回0。示例1:输入:target=7,nums=[2,......
  • 代码随想录day44 || 1143 最长公共子序列, 1035 不相交的线, 53 最大子序列和, 392 判
    1143最长公共子序列funclongestCommonSubsequence(text1string,text2string)int{ //思路和判断最长公共数组一样 //dp[i][j]表示以text1[i],text2[j]为结尾的最长公共子序列的长度 //iftext1[i]==text2[j]{dp[i+1][j+1]=dp[i][j]+1}else{dp[i+1][j+1]=......
  • 代码随想录算法训练营第四十三天 | 300.最长递增子序列 , 674. 最长连续递增序列 , 718.
    目录300.最长递增子序列 思路1.dp[i]的定义2.状态转移方程3.dp[i]的初始化4.确定遍历顺序 5.举例推导dp数组方法一:动态规划方法二:贪心心得收获 674.最长连续递增序列思路动态规划1.确定dp数组(dptable)以及下标的含义2.确定递推公式3.dp数组如何初始化4.......
  • 代码随想录算法训练营第二十九天(贪心 三)
    力扣题部分:134.加油站题目链接:.-力扣(LeetCode)题面:在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为......
  • 代码随想录 -- 哈希表 -- 四数之和
    18.四数之和-力扣(LeetCode)思路:(与三数之和类似,在外面加一层循环)    1. 先将nums 按升序排序    2. 初始状态:k=0,i= k+1,left= i+1,right= len(nums)-1        3. 进入第一层for循环:        如果 nums[k]>0andtarget>0 ......
  • 《星空》游戏崩溃弹窗提示“找不到pbvm115.dll文件”该怎么解决?星空游戏启动时闪退显
    在玩《星空》时,如果游戏崩溃并弹窗提示“找不到pbvm115.dll文件”,着实令人困扰。解决办法可以是在可靠的资源网站查找该文件并正确安装,或者对游戏进行完整性验证,也可检查相关驱动和运行库是否需要更新。本篇将为大家带来《星空》游戏崩溃弹窗提示“找不到pbvm115.dll文件”该怎......
  • 代码随想录算法day1-数组1
    题目1704.二分查找题目描述:给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4示例2:......