583.两个字符串的删除操作
-
题意:给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。
每步 可以删除任意一个字符串中的一个字符。
示例 1: 输入: word1 = "sea", word2 = "eat" 输出: 2 解释: 第一步将 "sea" 变为 "ea" ,第二步将 "eat "变为 "ea" 示例 2: 输入:word1 = "leetcode", word2 = "etco" 输出:4
-
思路,见代码注释
class Solution {
public int minDistance(String word1, String word2) {
char[] char1 = word1.toCharArray();
char[] char2 = word2.toCharArray();
//代表使以i-1结尾的word1和j-1结尾的word2相同所需要的最小步数
int[][] dp = new int[char1.length+1][char2.length+1];
//word2为空字符时,以i-1为结尾的word1要删除i-1个元素才能和空字符相同
for(int i = 0; i < char1.length+1; i++) {
dp[i][0] = i;
}
//与上同理
for(int j = 0; j < char2.length+1; j++) {
dp[0][j] = j;
}
for(int i = 1; i <= char1.length; i++) {
for(int j = 1; j <= char2.length; j++) {
if(char1[i-1] == char2[j-1]) { //此时不需要删除元素
dp[i][j] = dp[i-1][j-1];
} else { //此时有三种情况
//删word1,最少操作为dp[i-1][j] + 1;
//删word2,最少操作为dp[i][j-1] + 1;
//同时删word1和2,最少操作为dp[i-1][i-1]+2;
dp[i][j] = Math.min(Math.min(dp[i][j-1]+1, dp[i-1][j]+1), dp[i-1][j-1]+2);
}
}
}
return dp[char1.length][char2.length];
}
}
72.编辑距离
-
题意:给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
插入一个字符
删除一个字符
替换一个字符示例 1: 输入:word1 = "horse", word2 = "ros" 输出:3 解释: horse -> rorse (将 'h' 替换为 'r') rorse -> rose (删除 'r') rose -> ros (删除 'e') 示例 2: 输入:word1 = "intention", word2 = "execution" 输出:5 解释: intention -> inention (删除 't') inention -> enention (将 'i' 替换为 'e') enention -> exention (将 'n' 替换为 'x') exention -> exection (将 'n' 替换为 'c') exection -> execution (插入 'u')
-
思路,见代码
class Solution {
public int minDistance(String word1, String word2) {
char[] char1 = word1.toCharArray();
char[] char2 = word2.toCharArray();
//以i-1为结尾的word1转换成以j-1为结尾的word2所使用的最少操作数为dp[i][j]
int[][] dp = new int[char1.length+1][char2.length+1];
//初始化,dp[0][j]和dp[i][0];
for(int j = 0; j <= char2.length; j++) {
dp[0][j] = j;
}
for(int i = 0; i <= char1.length; i++) {
dp[i][0] = i;
}
for(int i = 1; i <= char1.length; i++) {
for(int j = 1; j <= char2.length; j++) {
if(char1[i-1] == char2[j-1]) {
//此时不操作
dp[i][j] = dp[i-1][j-1];
} else {
//此时有增、删、改3种操作
//word1中删除元素,dp[i-1][j]+1
//word2中删除元素,dp[i][j-1]+1
//为什么都是删除元素?在word2中删除元素,相当于在word1中增加元素;在word1中删除元素,相当于在word2中增加元素。
//替换元素,只需要一次替换,就可以让word1[i-1]=word2[j-1],即dp[i-1][j-1]+1
dp[i][j] = Math.min(Math.min(dp[i-1][j]+1, dp[i][j-1]+1), dp[i-1][j-1]+1);
}
}
}
return dp[char1.length][char2.length];
}
}