583. 两个字符串的删除操作
本题和动态规划:115.不同的子序列 相比,其实就是两个字符串都可以删除了,情况虽说复杂一些,但整体思路是不变的。
代码随想录
class Solution {public int minDistance(String word1, String word2) {int m = word1.length();int n = word2.length();//dp[i][j]:表示使word1中前i个字符和word2中前j个字符相等所需的最少删除次数int dp[][] = new int[m + 1][n + 1];for (int i = 0; i <= m; i++) dp[i][0] = i;for (int i = 0; i <= n; i++) dp[0][i] = i;for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {if (word1.charAt(i - 1) == word2.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1];} else {dp[i][j] = 1 + Math.min(dp[i - 1][j], dp[i][j - 1]);}}}return dp[m][n];}
}
72. 编辑距离
最终我们迎来了编辑距离这道题目,之前安排题目都是为了 编辑距离做铺垫。
代码随想录
class Solution {public int minDistance(String word1, String word2) {//dp[i][j] 为从字符串 A 的前 i 个字符转换到字符串 B 的前 j 个字符所需的最少操作次数//如果 A[i] == B[j],则 dp[i][j] = dp[i-1][j-1]//如果 A[i] != B[j],则有三种操作方式,取这三种方式的最小值://插入操作:dp[i][j-1] + 1//删除操作:dp[i-1][j] + 1//替换操作:dp[i-1][j-1] + 1int m = word1.length(), n = word2.length();int dp[][] = new int[m + 1][n + 1];for (int i = 0; i <= m; i++) dp[i][0] = i;for (int j = 0; j <= n; j++) dp[0][j] = j;for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {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][j - 1] + 1, dp[i - 1][j] + 1), dp[i - 1][j - 1] + 1);}}}return dp[m][n];}
}
编辑距离总结篇
做一个总结吧
代码随想录