583. 两个字符串的删除操作
给定两个单词 word1
和 word2
,返回使得 word1
和 word2
相同所需的最小步数。
每步 可以删除任意一个字符串中的一个字符。
示例 1:
输入: word1 = “sea”, word2 = “eat”
输出: 2
解释: 第一步将 “sea” 变为 “ea” ,第二步将 "eat "变为 “ea”
示例 2:
输入:word1 = “leetcode”, word2 = “etco”
输出:4
提示:(动态规划)
- 1 <= word1.length, word2.length <= 500
word1
和word2
只包含小写英文字母
思路:
删除最少的字符,使剩下的字符串相等,可以转换为求两个字符串的最长公共子序列。
- 求出最长公共子序列后,两个字符串的长度和减去2倍的最长公共子序列的长度,即为所需的最小部步数。
- 定义二维
dp
数组,dp[i][j]
表示word1
的前i
个字符和word2
的前j
个字符的最长公共子序列; - 只看
dp[i][j]
时,word1
的第i
个字符和word2
的第j
个字符,可能相等,可能不相等,两种情况:- 相等时:
d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] + 1 dp[i][j] = dp[i - 1][j - 1] + 1 dp[i][j]=dp[i−1][j−1]+1 - 不相等时:
d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − 1 ] ) dp[i][j] = max(dp[i - 1][j] , dp[i][j - 1] ) dp[i][j]=max(dp[i−1][j],dp[i][j−1])
- 相等时:
代码:(Java)
public class MinDistance {
public static void main(String[] args) {
// TODO Auto-generated method stub
String word1 = "leetcode";
String word2 = "etco";
System.out.println(minDistance(word1, word2));
}
public static int minDistance(String word1, String word2) {
int n = word1.length();
int m = word2.length();
int dp[][] = new int[n + 1][m + 1];
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; 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 m + n - 2 * dp[n][m];
}
}
运行结果:
复杂度分析:
- 时间复杂度:
O
(
n
∗
m
)
O(n*m)
O(n∗m) ,
n
为word1
的长度,m
为word2
的长度。 - 空间复杂度:
O
(
n
∗
m
)
O(n*m)
O(n∗m) ,
n
为word1
的长度,m
为word2
的长度。
注:仅供学习参考, 如有不足,欢迎指正!
题目来源:力扣。