代码随想录训练营第五十六天| 583. 两个字符串的删除操作 、72. 编辑距离

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

题目链接/文章讲解/视频讲解:代码随想录

1.代码展示

cpp 复制代码
//583.两个字符串的删除操作
int minDistance(string word1, string word2) {
	//step1 构建dp数组,dp[i][j]的含义是要使以i-1为结尾的word1和以j-1为结尾的word2
	//删除其元素后相同所需最小的删除步数
	vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));
	//step2 状态转移方程
	//if (word1[i - 1] == word[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, dp[i - 1][j - 1] + 2);
	//对应着三种情况,删除word1[i - 1]或者word2[j - 1]或者同时删除
	//step3 初始化
	for (int i = 0; i <= word1.size(); i++) {
		dp[i][0] = i;
	}
	for (int j = 0; j <= word2.size(); j++) {
		dp[0][j] = j;
	}
	//step4 开始遍历
	for (int i = 1; i <= word1.size(); i++) {
		for (int j = 1; j <= word2.size(); j++) {
			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, dp[i - 1][j - 1] + 2 });
			}
		}
	}
	return dp[word1.size()][word2.size()];
}

2.本题小节

思考: 首先明确dp[i][j]的含义是下标以i-1为结尾的word1和以下标为j-1结尾的word2删除元素相等所需的最少步骤。当word1[i - 1] == word2[j - 1]时,此时不需要删除元素,因此dp[i][j] = dp[i - 1][j - 1];当不相等时,此时既可以删除word1下标i-1处的元素,对应的是dp[i - 1][j] + 1,也可以删除word2下标j-1处的元素,对应的是dp[i][j-1] + 1,也可以是同时删除掉,对应的是dp[i - 1][j - 1] + 2,因此dp[i][j]从上面三种情况中选择最小的。初始化时要注意,dp[i][0]对应的位置初始化为i,dp[0][j]对应位置初始化为j,这个很好想。

步骤:注意思考的内容,按照步骤来即可。

  1. 编辑距离

题目链接/文章讲解/视频讲解:代码随想录

1.代码展示

cpp 复制代码
//72.编辑距离
int minDistance(string word1, string word2) {
	//step1 构建dp数组,dp[i][j]的含义是要使以i-1为结尾的word1和以j-1为结尾的word2
	//相同需要操作(增加、删减、替换)的次数
	vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));
	//step2 状态转移方程
	//if (word1[i - 1] == word[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, dp[i - 1][j - 1] + 1);
	//对应着三种情况,删掉word1[i - 1](删除),删掉word2[j - 1](增加),替换
		//step3 初始化
	for (int i = 0; i <= word1.size(); i++) {
		dp[i][0] = i;
	}
	for (int j = 0; j <= word2.size(); j++) {
		dp[0][j] = j;
	}
	//step4 开始遍历
	for (int i = 1; i <= word1.size(); i++) {
		for (int j = 1; j <= word2.size(); j++) {
			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, dp[i - 1][j - 1] + 1 });
			}
		}
	}
	return dp[word1.size()][word2.size()];
}

2.本题小节

思考:dp[i][j]的含义是以下标i-1为结尾的word1通过增加,删除,替换能够变成以下标j-1为结尾的word2所需要的最小步骤。当word1[i - 1] == word2[j - 1]时,此时不需要操作,则dp[i][j] = dp[i - 1][j - 1];当不相等时,可以通过删除(删除word1[i - 1])、增加(删除word2[j - 1])、和替换(word1[i - 1]替换为word[j - 1])来操作,分别对应的时dp[i - 1][j] + 1、dp[i][j - 1] + 1、dp[i - 1][j - 1] + 1,选择最小情况,初始化和上题一样。

基本步骤:根据思考和动态规划的步骤来即可。

编辑距离总结:代码随想录

相关推荐
小码农<^_^>3 分钟前
优选算法精品课--滑动窗口算法(一)
算法
羊小猪~~5 分钟前
神经网络基础--什么是正向传播??什么是方向传播??
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
软工菜鸡31 分钟前
预训练语言模型BERT——PaddleNLP中的预训练模型
大数据·人工智能·深度学习·算法·语言模型·自然语言处理·bert
南宫生33 分钟前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
AI视觉网奇1 小时前
sklearn 安装使用笔记
人工智能·算法·sklearn
JingHongB1 小时前
代码随想录算法训练营Day55 | 图论理论基础、深度优先搜索理论基础、卡玛网 98.所有可达路径、797. 所有可能的路径、广度优先搜索理论基础
算法·深度优先·图论
weixin_432702261 小时前
代码随想录算法训练营第五十五天|图论理论基础
数据结构·python·算法·深度优先·图论
小冉在学习1 小时前
day52 图论章节刷题Part04(110.字符串接龙、105.有向图的完全可达性、106.岛屿的周长 )
算法·深度优先·图论
Repeat7151 小时前
图论基础--孤岛系列
算法·深度优先·广度优先·图论基础
小冉在学习1 小时前
day53 图论章节刷题Part05(并查集理论基础、寻找存在的路径)
java·算法·图论