- 第九章 动态规划part16
-
- ● 583. 两个字符串的删除操作
- ● 72. 编辑距离
- ● 编辑距离总结篇
-
- 详细布置
-
- 583. 两个字符串的删除操作
-
- 本题和动态规划:115.不同的子序列 相比,其实就是两个字符串都可以删除了,情况虽说复杂一些,但整体思路是不变的。
- https://programmercarl.com/0583.%E4%B8%A4%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E5%88%A0%E9%99%A4%E6%93%8D%E4%BD%9C.html
-
- 72. 编辑距离
-
- 最终我们迎来了编辑距离这道题目,之前安排题目都是为了 编辑距离做铺垫。
-
- https://programmercarl.com/0072.%E7%BC%96%E8%BE%91%E8%B7%9D%E7%A6%BB.html
-
- 编辑距离总结篇
- 做一个总结吧
- https://programmercarl.com/%E4%B8%BA%E4%BA%86%E7%BB%9D%E6%9D%80%E7%BC%96%E8%BE%91%E8%B7%9D%E7%A6%BB%EF%BC%8C%E5%8D%A1%E5%B0%94%E5%81%9A%E4%BA%86%E4%B8%89%E6%AD%A5%E9%93%BA%E5%9E%AB.html
-
- 往日任务
- ● day 1 任务以及具体安排:https://docs.qq.com/doc/DUG9UR2ZUc3BjRUdY
- ● day 2 任务以及具体安排:https://docs.qq.com/doc/DUGRwWXNOVEpyaVpG
- ● day 3 任务以及具体安排:https://docs.qq.com/doc/DUGdqYWNYeGhlaVR6
- ● day 4 任务以及具体安排:https://docs.qq.com/doc/DUFNjYUxYRHRVWklp
- ● day 5 周日休息
- ● day 6 任务以及具体安排:https://docs.qq.com/doc/DUEtFSGdreWRuR2p4
- ● day 7 任务以及具体安排:https://docs.qq.com/doc/DUElCb1NyTVpXa0Jj
- ● day 8 任务以及具体安排:https://docs.qq.com/doc/DUGdsY2JFaFhDRVZH
- ● day 9 任务以及具体安排:https://docs.qq.com/doc/DUHVXSnZNaXpVUHN4
- ● day 10 任务以及具体安排:https://docs.qq.com/doc/DUElqeHh3cndDbW1Q
- ●day 11 任务以及具体安排:https://docs.qq.com/doc/DUHh6UE5hUUZOZUd0
- ●day 12 周日休息
- ●day 13 任务以及具体安排:https://docs.qq.com/doc/DUHNpa3F4b2dMUWJ3
- ●day 14 任务以及具体安排:https://docs.qq.com/doc/DUHRtdXZZSWFkeGdE
- ●day 15 任务以及具体安排:https://docs.qq.com/doc/DUHN0ZVJuRmVYeWNv
- ●day 16 任务以及具体安排:https://docs.qq.com/doc/DUHBQRm1aSWR4T2NK
- ●day 17 任务以及具体安排:https://docs.qq.com/doc/DUFpXY3hBZkpabWFY
- ●day 18 任务以及具体安排:https://docs.qq.com/doc/DUFFiVHl3YVlReVlr
- ●day 19 周日休息
- ●day 20 任务以及具体安排:https://docs.qq.com/doc/DUGFRU2V6Z1F4alBH
- ●day 21 任务以及具体安排:https://docs.qq.com/doc/DUHl2SGNvZmxqZm1X
- ●day 22 任务以及具体安排:https://docs.qq.com/doc/DUHplVUp5YnN1bnBL
- ●day 23 任务以及具体安排:https://docs.qq.com/doc/DUFBUQmxpQU1pa29C
- ●day 24 任务以及具体安排:https://docs.qq.com/doc/DUEhsb0pUUm1WT2NP
- ●day 25 任务以及具体安排:https://docs.qq.com/doc/DUExTYXVzU1BiU2Zl
- ●day 26 休息
- ●day 27 任务以及具体安排:https://docs.qq.com/doc/DUElpbnNUR3hIbXlY
- ●day 28 任务以及具体安排:https://docs.qq.com/doc/DUG1yVHdlWEdNYlhZ
- ●day 29 任务以及具体安排:https://docs.qq.com/doc/DUHZYbWhwSHRCRmp3
- ●day 30 任务以及具体安排:https://docs.qq.com/doc/DUEdTVVhxbnJiY3BR
- ●day 31 任务以及具体安排:https://docs.qq.com/doc/DUG1PQ1ZZY2xXY1ly
- ●day 32 任务以及具体安排:https://docs.qq.com/doc/DUGFEdGFWeVhleFF1
- ●day 33 周日休息
- ●day 34 任务以及具体安排:https://docs.qq.com/doc/DUEh5WFVlQkp1U0p4
- ●day 35 任务以及具体安排:https://docs.qq.com/doc/DUFRWc3BGRHFXZ1pO
- ●day 36 任务以及具体安排:https://docs.qq.com/doc/DUERGbnhhRkFRVENZ
- ●day 37 任务以及具体安排:https://docs.qq.com/doc/DUFVRd3p5SHFMSExQ
- ●day 38 任务以及具体安排:https://docs.qq.com/doc/DUGNUdVpoT0VJR01l
- ●day 39 任务以及具体安排:https://docs.qq.com/doc/DUE55cVJ5WkNoREhS
- ●day 40 周日休息
- ●day 41 任务以及具体安排:https://docs.qq.com/doc/DUFhIUXRFYnVGUkFp
- ●day 42 任务以及具体安排:42 第八章 动态规划
- ●day 43 任务以及具体安排:43第八章 动态规划
- ●day 44 任务以及具体安排:44 第八章 动态规划
- ●day 45 任务以及具体安排:45 第八章 动态规划
- ●day 46 任务以及具体安排:46 第八章 动态规划
- ●day 47 周日休息
- ●day 48 任务以及具体安排:48 第八章 动态规划
- ●day 49 任务以及具体安排:49 第八章 动态规划
- ●day 50 任务以及具体安排:50 第八章 动态规划
- ●day 51 任务以及具体安排:51 第八章 动态规划
- ●day 52 任务以及具体安排:52 第八章 动态规划
- ●day 53 任务以及具体安排:53 第八章 动态规划
- ●day 54 周日休息
- ● day 55 任务以及具体安排:55 第八章 动态规划
目录
- package com.question.solve.leetcode.programmerCarl2._10_dynamicProgramming;
-
- public class _0583_两个字符串的删除操作 {
- }
-
- //dp数组中存储word1和word2最长相同子序列的长度
- class Solution0583 {
- public int minDistance(String word1, String word2) {
- int len1 = word1.length();
- int len2 = word2.length();
- int[][] dp = new int[len1 + 1][len2 + 1];
- for (int i = 1; i <= len1; i++) {
- for (int j = 1; j <= len2; j++) {
- if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
- dp[i][j] = dp[i - 1][j - 1] + 1;
- } else {
- dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
- }
- }
- }
- return len1 + len2 - dp[len1][len2] * 2;
- }
- }
-
- //dp数组中存储需要删除的字符个数
- class Solution0583_2 {
- public int minDistance(String word1, String word2) {
- int[][] dp = new int[word1.length() + 1][word2.length() + 1];
- for (int i = 0; i < word1.length() + 1; i++) dp[i][0] = i;
- for (int j = 0; j < word2.length() + 1; j++) dp[0][j] = j;
- for (int i = 1; i < word1.length() + 1; i++) {
- for (int j = 1; j < word2.length() + 1; j++) {
- if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
- dp[i][j] = dp[i - 1][j - 1];
- } else {
- dp[i][j] = Math.min(dp[i - 1][j - 1] + 2,
- Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1));
- }
- }
- }
- return dp[word1.length()][word2.length()];
- }
- }
-
- //DP - longest common subsequence (用最长公共子序列反推)
- class Solution0583_3 {
- public int minDistance(String word1, String word2) {
- char[] char1 = word1.toCharArray();
- char[] char2 = word2.toCharArray();
- int len1 = char1.length;
- int len2 = char2.length;
- int dp[][] = new int[len1 + 1][len2 + 1];
- for (int i = 1; i <= len1; i++) {
- for (int j = 1; j <= len2; j++) {
- if (char1[i - 1] == char2[j - 1])
- dp[i][j] = dp[i - 1][j - 1] + 1;
- else
- dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
- }
- }
- return len1 + len2 - (2 * dp[len1][len2]);//和leetcode 1143只差在這一行。
- }
- }
- package com.question.solve.leetcode.programmerCarl2._10_dynamicProgramming;
-
- public class _0072_编辑距离 {
- }
-
- class Solution0072 {
- public int minDistance(String word1, String word2) {
- int m = word1.length();
- int n = word2.length();
- int[][] dp = new int[m + 1][n + 1];
- //初始化
- for (int i = 1; i <= m; i++) {
- dp[i][0] = i;
- }
- for (int j = 1; j <= n; j++) {
- dp[0][j] = j;
- }
- for (int i = 1; i <= m; i++) {
- for (int j = 1; j <= n; j++) {
- //因为dp数组有效位从1开始
- //所以当前遍历到的字符串的位置为i-1 | j-1
- if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
- dp[i][j] = dp[i - 1][j - 1];
- } else {
- dp[i][j] = Math.min(Math.min(dp[i - 1][j - 1], dp[i][j - 1]), dp[i - 1][j]) + 1;
- }
- }
- }
- return dp[m][n];
- }
- }
-
- class Solution0072_2 {
- public int minDistance(String word1, String word2) {
- int m = word1.length();
- int n = word2.length();
- int[][] dp = new int[m + 1][n + 1];
- for (int i = 1; i <= m; i++) {
- dp[i][0] = i;
- }
- for (int i = 1; i <= n; i++) {
- dp[0][i] = i;
- }
- for (int i = 1; i <= m; i++) {
- for (int j = 1; j <= n; j++) {
- int left = dp[i][j - 1] + 1;
- int mid = dp[i - 1][j - 1];
- int right = dp[i - 1][j] + 1;
- if (word1.charAt(i - 1) != word2.charAt(j - 1)) {
- mid++;
- }
- dp[i][j] = Math.min(left, Math.min(mid, right));
- }
- }
- return dp[m][n];
- }
- }
- 判断子序列
- 不同的子序列
- 两个字符串的删除操作
- 编辑距离