声明:小白总结,本意是记录自己的思路,不过希望能帮助别人,那就更好啦,若发现问题,欢迎指正,感谢!!
来源:力扣(LeetCode)
链接:72.编辑距离
题目
给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
插入一个字符
删除一个字符
替换一个字符
题目分析
将一个字符串通过“增,删,替换”这三种操作,使其与另一字符串相同,我们设置一个二维数组,dp[m][n],其中m指word1的前m个字母,n指word2的前n个字母。
代码注释
// java
class Solution {
public int minDistance(String word1, String word2) {
int m = word1.length();//得到word1的长度
int n = word2.length();//得到word2的长度
int[][] dp = new int[m + 1][n + 1];//定义二维数组表示两个字符串在一定长度下的编辑次数
dp[0][0] = 0;//若两个字符串的长度均为0,则需编辑次数也为0
for(int i = 1; i <= m; i++){
dp[i][0] = i;//若word2的长度为0,word1的字符串长度即为需操作次数(删)
}
for(int j = 1; j <= n; j++){
dp[0][j] = j;//若word1的长度为0,word2的长度即为需操作次数(增)
}
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(dp[i][j - 1], Math.min(dp[i - 1][j], dp[i - 1][j - 1])) + 1;//如果不相等,若i少1,则与j - 1时的操作数相同的基础上执行增,若i多1,则与 i - 1与j时的操作数的基础上执行删,否则与i - 1和j - 1时的操作数的基础上执行换
}
}
}
return dp[m][n];返回长度为m,n时的操作数
}
}
感谢各位巨巨们的帮助,希望在记录分析题目的条件下算法能有所提升……