代码随想录算法训练营第48天 | 序列问题最终篇

news/2024/10/18 16:04:45/文章来源:https://www.cnblogs.com/P201821440041/p/18325604

115.不同的子序列
https://leetcode.cn/problems/distinct-subsequences/description/
代码随想录
https://programmercarl.com/0115.不同的子序列.html#算法公开课

https://leetcode.cn/problems/delete-operation-for-two-strings/description/
https://programmercarl.com/0583.两个字符串的删除操作.html
https://leetcode.cn/problems/edit-distance/description/
https://programmercarl.com/0072.编辑距离.html

115.不同的子序列

  • dp[i][j]的含义:第i-1字符串中j-1字符串出现的个数;
  • 初始化:考虑dp[i][0]的情况:出现空字符串的个数都为1;dp[0][j]的情况:肯定都是0;
  • 递推:
    • s[i-1]==t[j-1]相等时;
      • 情况1:dp[i-1][j-1]加上这个元素的字符串个数:就差这个元素的个数:ba
      • 情况2:dp[i-1][j]:比现在少的字符串中就包含了j的字符串的个数:之前包含的bag的个数
      • 例如:babagg=>babag中含有的bag的个数+babag中含有ba的个数=总共的个数;
    • s[i-1]!=t[j-1]时
      • 只有之前所包含的字符串的个数;
点击查看代码 ```python class Solution:def numDistinct(self, s: str, t: str) -> int:
    m = len(s)n = len(t)## 定义dpdp = [[0] *(n+1) for _ in range(m+1)]##初始化for i in range(m+1):dp[i][0] = 1##遍历for i in range(1,m+1):for j in range(1,n+1):if s[i-1] == t[j-1]:dp[i][j] = dp[i-1][j-1]+dp[i-1][j]else:dp[i][j] = dp[i-1][j]return dp[-1][-1]
</details># 583. 两个字符串的删除操作
## 题解
### 思路一:直接记录需要删除元素的个数;
- dp[i][j]的含义:i-1结尾和j-1的字符串需要删除的字符的个数;
- 初始化:- dp[0][j] = j 和空字符串比需要删的就是自身的个数;- dp[i][0] = i
- 递推- 字符串相同时:不需要做删除操作- dp[i][j] = dp[i-1][j-1]- 字符串不同时:考虑三种情况:dp[i][j] = min(dp[i-1][j]+1,dp[i][j-1]+1)- 斜对角:删除2个元素;(可以合并)- 删除s- 删除t<details>
<summary>点击查看代码</summary>```python
class Solution:def minDistance(self, word1: str, word2: str) -> int:m = len(word1)n = len(word2)dp = [[0]*(n+1) for _ in range(m+1)]for i in range(m+1):dp[i][0] = ifor j in range(n+1):dp[0][j] = jfor i in range(1,m+1):for j in range(1,n+1):if word1[i-1]==word2[j-1]:dp[i][j] = dp[i-1][j-1]else:dp[i][j] = min(dp[i-1][j]+1,dp[i][j-1]+1)return dp[-1][-1]

思路二:计算相同元素,删除不同即可

  • dp[i][j]的含义:i-1结尾和j-1的字符串相同字符串的个数
  • dp[i][j]全部为0
  • 递推:
    • 字符串相同时
      -dp[i][j] =dp[i-1][j-1]+1
    • 字符串不同时:找包含最多的字符串
      -dp[i][j]= max(dp[i-1][j],dp[i][j-1])
点击查看代码
class Solution:def minDistance(self, word1: str, word2: str) -> int:m = len(word1)n = len(word2)dp = [[0]*(n+1) for _ in range(m+1)]for i in range(1,m+1):for j in range(1,n+1):if word1[i-1]==word2[j-1]:dp[i][j] = dp[i-1][j-1]+1else:dp[i][j] = max(dp[i-1][j],dp[i][j-1])res = m+n-2*dp[-1][-1]return res

72. 编辑距离

题解

  • dp[i][j]含义:i-1结尾的word1 转换成 j-1结尾的word2 所使用的最少操作数
  • 初始化:dp[i][0] = i dp[0][j] =j 全部都是删除
  • 递推
    • 字符串相同时:
      -不需要有操作:dp[i][j] = dp[i-1][j-1]
    • 字符串不同时:
      • 删除增加:word1删除:dp[i-1][j]+1 word2删除:dp[i][j-1]+1
      • 替换:word1[i-1]换成wor2[j-1]:dp[i-1][j-1]+1
点击查看代码
import numpy as np
class Solution:def minDistance(self, word1: str, word2: str) -> int:m = len(word1)n = len(word2)dp = [[0]*(n+1) for _ in range(m+1)]for i in range(m+1):dp[i][0] = ifor j in range(n+1):dp[0][j] = jfor i in range(1,m+1):for j in range(1,n+1):if word1[i-1]==word2[j-1]:dp[i][j] = dp[i-1][j-1]else:dp[i][j] = min(dp[i-1][j-1]+1,dp[i-1][j]+1,dp[i][j-1]+1)return dp[-1][-1]

总结编辑距离篇

  • 做题方法:自己将dp矩阵写出来 尝试自己按照含义找一下;在找的过程中总结状态转移方程;
  • 不要找规律,记不住的;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/772678.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024暑假集训测试13

前言比赛链接。从来没见过交互题,T1 狂 CE 不止心态炸了,后面的题也没打好,T2、T3 简单题都不会了,所以为啥 T4 又放黑题。 T1 大众点评原题:AT_joisc2014_d。难点主要在交互,赛时琢磨了半场比赛终于搞明白是啥玩意儿了,可以将给定库当成压缩的一部分代码,可以调用里面…

51nod-3976-最长序列

https://class.51nod.com/Html/Textbook/ChapterIndex.html#textbookId=126&chapterId=338 https://class.51nod.com/Html/Textbook/Problem.html#problemId=3976&textbookChapterId=725 LIS是符号只有大于或小于,所以这道题就是LIS问题。 状态设计同LIS,由于答案就是…

Spring 常用的三种拦截器详解

在开发过程中,我们常常使用到拦截器来处理一些逻辑。最常用的三种拦截器分别是 AOP、 Interceptor 、 Filter,但其实很多人并不知道什么时候用AOP,什么时候用Interceptor,什么时候用Filter,也不知道其拦截顺序,内部原理。今天我们详细介绍一下这三种拦截器。前言 在开发过…

Lambda、LINQ

1.Lambda表达式的使用示例如下:2.Linq示例:

并发容器

Java 的并发集合容器提供了在多线程环境中高效访问和操作的数据结构。这些容器通过内部的同步机制实现了线程安全,使得开发者无需显式同步代码就能在并发环境下安全使用,比如说:ConcurrentHashMap、阻塞队列和 CopyOnWrite 容器等。 java.util 包下提供了一些容器类(集合框…

win10运行交互题

这是题目给的 题目要求输入的编译命令g++ -O2 -o grader grader.cpp ramen.cpp 在\(DEV\)下是运行不了的 系统的\(CMD\)也是不行的 但我们可以用\(DEV\)中的\(system\)函数运行 int main() {system("g++ -O2 -o grader grader.cpp ramen.cpp"); return 0; }运行前在\…

15、flask-模型-models-表的操作-分页paginate()

paginate()的属性属性名 说明items 返回当前页的内容列表has_next 是否还有下一页has_prev 是否还有上一页next(error_out=False) 返回下一页的pagination对象prev(error_out=False) 返回上一页的Pagination对象page 当前页的页码pages 总页数per_page 每页显示的数量prev_num …

01-从WordCount程序理解Spark术语及术语间的关系

1. 应用程序(Application) 通过下面的代码设置应用程序名称,设置后再UI中可以看到相应的名称。 //1.设置Application的名称 val conf = new SparkConf() conf.setAppName("WordCount") conf.setMaster("local")2. Job Job由scala的执行算子生成,每个执…

leetcode-5

题目: 给你一个字符串 s,找到 s 中最长的 回文子串 示例 1:输入:s = "babad"  输出:"bab"  解释:"aba" 同样是符合题意的答案。 示例 2:输入:s = "cbbd"   输出:"bb" 提示: 1 <= s.length <= 1000…

Uniapp 之手写签名

一、效果图二、代码示例 qianming.jsexport const qianming = {data() {return {windowWidth: 0,pixelRatio: 0,context: null,points: [],oldPoints: [],qm_width: 280,qm_height: 120,qm_img: }},methods: {qm_start() {const systemInfo = uni.getSystemInfoSync()this.wind…

代码随想录day11 || 150 逆表达式求值 239 滑动窗口最大值 347 前k最高频元素

150 逆波兰表达式计算func evalRPN(tokens []string) int {// 自己想是真的想不出来,看了视频之后有了思路// 本质上逻辑就是遇到数字入栈,遇到运算符号 出栈两个元素然后计算再入栈,最终就是计算结果stack := Constructor()for _, val := range tokens{// 如果数字入栈if i…

计算机组成与体系结构-校验码

奇偶校验码 奇偶校验是一种简单有效的校验方法,这种方法通过在编码中增加一位校验位来使编码中1的个数为奇数(奇校验)或者为偶数(偶校验),只能发现奇数个数据位 出错的情况.循环冗余校验码 CRC(Cyclic RedundancyCheck)循环冗余校验是一种常用的错误检测技术,用于在数据传输…