提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
题目描述
给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。
示例:
输入: “sea”, “eat”
输出: 2
解释: 第一步将"sea"变为"ea",第二步将"eat"变为"ea"
提示:
给定单词的长度不超过500。
给定单词中的字符只含有小写字母。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/delete-operation-for-two-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题过程
解题思路
动态规划:dp[i][j]表示使word1和word2的前i个和前j个字符相同的最少步数。状态转移方程为:
dp[i][j] = 1、dp[i - 1][j - 1],word1[i] == word2[j];
2、min(dp[i - 1][j], dp[i][j - 1]), word1[i] != word2[j]。
此外,还要处理首行和首列,
dp[i][j] = i + j,i == 0 || j == 0。
class Solution {
public int minDistance(String word1, String word2) {
int n1 = word1.length();
int n2 = word2.length();
int dp [][] = new int[n1 + 1][n2 + 1];
//初始化
for (int i = 0; i < n1 + 1; i++) {
for (int j = 0; j < n2 + 1; j++) {
if(i == 0 || j == 0){//首行和首列会被首先处理
dp[i][j] = i + j;
}
else 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], dp[i][j - 1]) + 1;
}
}
}
return dp[n1][n2];
}
}