代码随想录算法训练营第 45 天 |LeetCode 115.不同的子序列 LeetCode583. 两个字符串的删除操作 LeetCode72. 编辑距离

server/2024/10/16 2:27:23/

代码随想录算法训练营

Day45 代码随想录算法训练营第 45 天 |LeetCode 115.不同的子序列 LeetCode583. 两个字符串的删除操作 LeetCode72. 编辑距离


目录

  • 代码随想录算法训练营
  • 前言
    • LeetCode 115.不同的子序列
    • LeetCode583. 两个字符串的删除操作
    • LeetCode72. 编辑距离
  • 一、LeetCode115.不同的子序列
    • 1.题目链接
    • 2.思路
    • 3.题解
  • 二、LeetCode583. 两个字符串的删除操作
    • 1.题目链接
    • 2.思路
    • 3.题解
  • 三、LeetCode72. 编辑距离
    • 1.题目链接
    • 2.思路
    • 3.题解


前言

LeetCode 115.不同的子序列

讲解文档

LeetCode583. 两个字符串的删除操作

讲解文档

LeetCode72. 编辑距离

讲解文档


一、LeetCode115.不同的子序列

1.题目链接

LeetCode115.不同的子序列

2.思路

(1)dp[i][j] :t[0,j]在S[0,i]的范围内,出现多少次
(2)状态转移方程
1)s[i] == t[j] :s[i] 和 t[j] 都可以加入子串
出现次数包括两部分
① 用s[i] 对t[j]进行匹配:
s[i] 对t[j]进行匹配,那么只需要在S[0,i-1]中t[0,j-1]进行匹配,
t[0,j]在S[0,i]的范围内出现次数等于t[0,j-1]在S[0,i-1]中出现次数
②不用s[i] 对t[j]进行匹配:t[0,j]在S[0,i]的范围内出现次数等于t[0,j]的子串在S[0,i-1]的子串出现次数
2)s[i] != t[j]:s[i] 不可以加入子串
不能用s[i] 对t[j]进行匹配:t[0,j]在S[0,i]的范围内出现次数等于t[0,j]的子串在S[0,i-1]的子串出现次数

3.题解

class Solution {
public:long long numDistinct(string s, string t) {if (s.size() < t.size())return 0;vector<vector<long long>> dp(s.size(), vector<long long>(t.size(), 0));if (s[0] == t[0])dp[0][0] = 1;for (int i = 1; i < s.size(); i++) {if (s[i] == t[0]) {dp[i][0] = (1 + dp[i - 1][0]);} else {dp[i][0] = dp[i - 1][0];}}for (int i = 1; i < s.size(); i++) {for (int j = 1; j < t.size(); j++) {if (s[i] == t[j])dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];elsedp[i][j] = dp[i - 1][j];dp[i][j] %= (1000000000 + 7);}}return dp[s.size() - 1][t.size() - 1];}
};

二、LeetCode583. 两个字符串的删除操作

1.题目链接

LeetCode583. 两个字符串的删除操作

2.思路

(1)dp[i][j]:将word1[0,i] word2[0,j]变成一样所需的步骤
(2)状态转移:
1)word1[i] == word2[j]:只需要将word1[0,i-1] word2[0,j-1]变成一样
2)word1[i] != word2[j]:
① 删word1[i]:word1[0,i-1] word2[0,j]变成一样需要删的元素+1
②删word2[j]:word1[0,i] word2[0,j-1]变成一样需要删的元素+1
③ 删word1[i]和word2[j]:word1[0,i-1] word2[0,j-1]变成一样需要删的元素+2
由于③可以看作①或②得到的,所以不考虑
(3)初始化
1)i=0:
只要出现过word1[0] 等于word2[j],那么此后需要删除的元素数为j (因为word2除了word2[j]以外的元素有j个)
在出现之前,需要删除的元素数为j+2 (要删除word1[0]和word2里面j+1个元素)
2)j=0:
只要出现过word1[i] 等于word2[0],那么此后需要删除的元素数为i (因为word1除了word1[i]以外的元素有j个)
在出现之前,需要删除的元素数为i+2 (要删除word2[0]和word1里面i+1个元素)

3.题解

class Solution {
public:int minDistance(string word1, string word2) {int n = word1.size();int m = word2.size();vector<vector<int>> dp(n, vector(m, 0));int flag = 0;for (int i = 0; i < n; i++) {if (word1[i] == word2[0])flag = 1;if (flag)dp[i][0] = i;elsedp[i][0] = i + 2;}flag = 0;for (int i = 0; i < m; i++) {if (word1[0] == word2[i])flag = 1;if (flag)dp[0][i] = i;elsedp[0][i] = i + 2;}for (int i = 1; i < n; i++) {for (int j = 1; j < m; j++) {if (word1[i] == word2[j]) {dp[i][j] = dp[i - 1][j - 1];} else {dp[i][j] = min(dp[i][j - 1] + 1, dp[i - 1][j] + 1);}}}return dp[n - 1][m - 1];}
};

三、LeetCode72. 编辑距离

1.题目链接

LeetCode72. 编辑距离

2.思路

(1)dp[i][j]:将word1[0,i] 变成word2[0,j]所需的最少步骤
(2)状态转移:
1)word1[i] == word2[j]:只需要将word1[0,i-1] 变成word2[0,j-1]
2)word1[i] != word2[j]:
① 删word1[i]:word1[0,i-1] 变成word2[0,j]需步骤+1
②添加word2[j]:word1[0,i] 变成word2[0,j-1]需要步骤+1
③ word1[i] 替换为 word2[j]:word1[0,i-1] 变成word2[0,j-1]需要步骤+1
由于③可以看作①或②得到的,所以不考虑
(3)初始化
1)i=0:
只要出现过word1[0] 等于word2[j],那么此后需要删除的元素数为j (因为word2除了word2[j]以外的元素有j个)
在出现之前,需要改变的元素数为j+1 (要将word1变为word2里面j+1个元素)
2)j=0:
只要出现过word1[i] 等于word2[0],那么此后需要删除的元素数为i (因为word1除了word1[i]以外的元素有j个)
在出现之前,需要删除的元素数为i+1 (要将word2变成word1里面i+1个元素)

3.题解

class Solution {
public:int minDistance(string word1, string word2) {int n = word1.size();int m = word2.size();if (n == 0)return m;if (m == 0)return n;vector<vector<int>> dp(n, vector<int>(m, 0));int flag = 0;for (int i = 0; i < n; i++) {if (word1[i] == word2[0])flag = 1;if (flag)dp[i][0] = i;elsedp[i][0] = i + 1;}flag = 0;for (int i = 0; i < m; i++) {if (word1[0] == word2[i])flag = 1;if (flag)dp[0][i] = i;elsedp[0][i] = i + 1;}for (int i = 1; i < n; i++) {for (int j = 1; j < m; j++) {if (word1[i] == word2[j])dp[i][j] = dp[i - 1][j - 1];else {dp[i][j] =min({dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]}) + 1;}}}return dp[n - 1][m - 1];}
};


http://www.ppmy.cn/server/100939.html

相关文章

Java填充PDF并返回填充后PDF文件及对应base64码

前期准备 下载PDF编辑工具&#xff08;Adobe Acrobat 9 Pro&#xff09;&#xff1a; 可以主页关注小程序【白哥Java】回复【PDF编辑软件】即可获取 或者直接联系博主也可 主页如下&#xff1a; 软件使用流程 此处流程为文本域流程 图片或其他大致相同 生成模板PDF样式如下&…

Node.js、npm和ng之间的关系

一、Node.js 定义&#xff1a;Node.js是一个开源的、跨平台的JavaScript运行环境&#xff0c;它允许开发者在服务器端运行JavaScript代码。Node.js基于Chrome V8引擎&#xff0c;提供高性能和非阻塞I/O&#xff08;输入输出&#xff09;操作。功能&#xff1a;Node.js主要用于…

JSON与EXL文件互转

功能&#xff1a;实现json到excel文件的相互转换(支持json多选版) 目的&#xff1a;编码与语言对应&#xff0c;方便大家使用 页面设计&#xff1a; 介绍&#xff1a; 1.选择文件栏目选择想要转换的文件 2.生成路径是转换后文件所在目录 3.小方框勾选与不勾选分别代表exl到…

【C++11】右值引用的深度解析(什么是右值引用?它有什么作用?能应用在那些场景?)

目录 一、前言 二 、什么是左值什么是右值&#xff1f; &#x1f525;左值&#x1f525; &#x1f525;右值 &#x1f525; 三、什么是右值引用&#xff1f; &#x1f4a7;左右引用的“引出”&#x1f4a7; &#x1f4a7;左值引用 &#x1f4a7; &#x1f4a7;右值引用…

无人机里的陀螺仪/加速器/气压计/GPS详解

陀螺仪 是一种用于测量和控制无人机姿态的重要传感器。它通过检测无人机的旋转运动来提供准确的方向和角度信息。 加速度计 用于提供无人机在XYZ三轴方向所承受的加速力。它也能决定无人机在静止状态时的倾斜角度。 气压计 通过测量大气压力来估算无人机的高度。随着高度的…

CPU飙升 怎么定位问题

传统的方法 【top】 查看所有进程占系统CPU的排序&#xff0c;定位是哪个进程搞的鬼。PID那一列就是进程号。 【top -Hp pid】 定位进程中使用 CPU 最高的线程tid 【printf ‘0x%x’ tid】 线程 tid 转化 16 进制,例如printf ‘0x%x’ 11882 得到16进制的 0x2e6a 【jstack…

CentOS中使用tar命令来压缩和解压指定的目录

压缩目录: tar -czvf test.tar.gz test/解压缩到当前目录: tar -xzvf test.tar.gz解释&#xff1a; tar 是用来打包和解压文件的命令。 -c 代表创建一个新的压缩文件。 -x 代表解压文件。 -z 代表使用gzip压缩或解压缩。 -v 代表在压缩或解压时显示详细信息。 -f 后面跟着要创…

密码学基础---椭圆曲线一文打尽

1.ECC简介及密钥生成 当前公认安全有效的三大类公钥密钥体制分别为基于大数因子分解难题(RSA)、离散对数难题(DSA)和椭圆曲线离散对数&#xff08;ECC&#xff09;难题的密码体制。 最初RSA由于其容易理解被广泛运用&#xff0c;但随着计算机性能的提升&#xff0c;要保证RS…