算法训练营day46 | {115.不同的子序列, 583.两个字符串的删除操作, 72.编辑距离}
第九章动态规划-part12,编辑距离是用动规来解决的经典题目。
115. 不同的子序列
- 题目链接:115.不同的子序列
- 文档讲解:代码随想录
- 视频讲解:动态规划之子序列,为了编辑距离做铺垫 | LeetCode:115.不同的子序列
- 状态:本题要求子序列的个数,第一遍做题还是有点生疏。
1.1 解题分析
s = “babgbag”
t = “bag”
DP五部曲:
- dp数组定义:
- dp[i][j]表示以i - 1结尾的s中有以j - 1结尾的t的个数是dp[i][j]个。
- 递推公式:
- 如果s[i - 1]和t[j - 1]相等,继续比较s[i-2]和t[j-2],或者对s做删除(减法),比如s=”bagg”,比较s[i-2]和t[j-1]是否相等。
- if(s[i - 1] == t[j - 1]) dp[i][j] = dp[i - 2][j - 2] + dp[i - 1][j]
- else dp[i][j] = dp[i - 1][j]
- 遍历顺序:从左到右,从上到下。
- 打印dp数组。
1.2 解题小结
▶
115.不同的子序列1 | |
583. 两个字符串的删除操作
- 题目链接:583. 两个字符串的删除操作
- 文档讲解:代码随想录
- 视频讲解:动态规划之子序列,还是为了编辑距离做铺垫 | LeetCode:583.两个字符串的删除操作
- 状态:两个字符串都可以删除。另一种解题思路仍然是求最长公共子序列。
2.1 解题分析
s = “sea”
t = “eat”
DP五部曲:
- dp数组定义:
- dp[i][j]表示以i-1结尾的word1和以j-1结尾的word2相同所需的最小步数
- 递推公式:
- if (s[i - 1] == t[j - 1]) d[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数组初始化:
- dp[i][0] = i
- dp[0][j] = j
- 遍历顺序:从左到右,从上到下。
- 打印dp数组。
2.2 解题小结
▶
583. 两个字符串的删除操作1 | |
解法二:求最长公共子序列的和,然后,word1.size + word2.size - longestSubLength * 2
72. 编辑距离
- 题目链接:72. 编辑距离
- 文档讲解:代码随想录
- 视频讲解:动态规划终极绝杀! LeetCode:72.编辑距离
- 状态:让word1变成word2,对word1进行删除和添加操作,等价于word1删除,word2删除,两个单词相同的最少操作个数。
3.1 解题分析
很经典的dp题目,用动态规划巧妙地解决解决编辑距离问题。
word1 = “horse”
word2 = “ros”
1 | |
DP五部曲:
- dp数组定义:
- dp[i][j]表示以i-1为结尾的word1和以j-1为结尾的word2相同的最少操作次数
- 递推公式:
- 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)
- dp数组初始化:
- dp[i][0] = i
- dp[0][j] = j
- 遍历顺序:从左到右,从上到下。
- 打印dp数组。
3.2 解题小结
▶
72. 编辑距离1 | |
4. 今日收获
- 编辑距离总结
- 学习时长:3小时
算法训练营day46 | {115.不同的子序列, 583.两个字符串的删除操作, 72.编辑距离}
http://paopaotangzu.xyz/cn/day46_leetcode/