首页 > 编程语言 >代码随想录算法训练营第48天 | 序列问题最终篇

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

时间:2024-07-27 17:06:39浏览次数:7  
标签:48 个数 训练营 随想录 range word1 word2 字符串 dp

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)
    ## 定义dp
    dp = [[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] = i
        for j in range(n+1):
            dp[0][j] = j

        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]
                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]+1
                else:
                    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] = i
        for j in range(n+1):
            dp[0][j] = j

        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]
                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矩阵写出来 尝试自己按照含义找一下;在找的过程中总结状态转移方程;
  • 不要找规律,记不住的;

标签:48,个数,训练营,随想录,range,word1,word2,字符串,dp
From: https://www.cnblogs.com/P201821440041/p/18325604

相关文章

  • 代码随想录||day25 非递减子序列,全排列问题
    491非递减子序列力扣题目链接题目描述:给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。示例1:输入:nums=......
  • 代码随想录day24打卡|| 93复原ip地址 78子集| 90子集||
    93复原ip地址力扣题目链接题目描述有效IP地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。例如:"0.1.2.201" 和"192.168.1.1" 是 有效 IP地址,但是 "0.011.255.245"、"192.168.1.312" 和 "[email protected]" 是 无......
  • 代码随想录算法训练营第47天 | 动态序列11:序列专题2
    代码随想录算法训练营第天|1143.最长公共子序列https://leetcode.cn/problems/longest-common-subsequence/description/代码随想录https://programmercarl.com/1143.最长公共子序列.html#算法公开课1035.不相交的线https://leetcode.cn/problems/uncrossed-lines/descrip......
  • 代码随想录day11 || 150 逆表达式求值 239 滑动窗口最大值 347 前k最高频元素
    150逆波兰表达式计算funcevalRPN(tokens[]string)int{ //自己想是真的想不出来,看了视频之后有了思路 //本质上逻辑就是遇到数字入栈,遇到运算符号出栈两个元素然后计算再入栈,最终就是计算结果 stack:=Constructor() for_,val:=rangetokens{ //如果数字入......
  • 代码随想录算法训练营第23天 | 回溯进阶
    2024年7月25日题39.组合总和由于每个元素可以用多次,要想到在每次递归里还要循环即可。代码首先给各个候选排序,从小到大依次提高门槛,每次回溯就提高index。classSolution{List<List<Integer>>res;List<Integer>path;inttarget;int[]candidates;......
  • 「代码随想录算法训练营」第二十二天 | 回溯算法 part4
    491.非递减子序列题目链接:https://leetcode.cn/problems/non-decreasing-subsequences/题目难度:中等文章讲解:https://programmercarl.com/0491.递增子序列.html视频讲解:https://www.bilibili.com/video/BV1EG4y1h78v/题目状态:有思路,借助ChatGPT通过思路:在之前代码的基......
  • 「代码随想录算法训练营」第二十一天 | 回溯算法 part3
    93.复原IP地址题目链接:https://leetcode.cn/problems/restore-ip-addresses/题目难度:中等文章讲解:https://programmercarl.com/0093.复原IP地址.html视频讲解:https://www.bilibili.com/video/BV1XP4y1U73i/题目状态:好难,看题解通过思路:和分割回文串一样,甚至更难,在单层......
  • 基于RS485的Modbus协议
    RS485:用来传输数据,RS485是一种差分传输的串行通信标准,以其强大的抗干扰能力、长距离传输和多点通信能力,在工业控制领域得到广泛应用。RS485使用一对差分信号线(A和B)来传输数据,差分信号能有效抵抗共模干扰,提高通信的可靠性。RS485通信可以是半双工或全双工,具体取决于应用配置。......
  • 代码随想录day10 || 232 栈实现队列, 225 队列实现栈,20 删除有效括号,1047 删除字符串相
    232实现队列//go本身并不支持原生的栈和队列结构,都是通过切片实现的//leetcodesubmitregionbegin(Prohibitmodificationanddeletion)typeMyQueuestruct{ Data[]int Sizeint}funcConstructor()MyQueue{ returnMyQueue{}}func(this*MyQueue)Push(......
  • 代码随想录算法训练营第45天 | 子序列入门
    300.最长递增子序列https://leetcode.cn/problems/longest-increasing-subsequence/代码随想录https://programmercarl.com/0300.最长上升子序列.html674.最长连续递增序列https://leetcode.cn/problems/longest-continuous-increasing-subsequence/description/代码随想录......