原题链接:
https://leetcode.cn/problems/edit-distance/description/
完成情况:
解题思路:
这段代码是一个动态规划算法,用于计算将一个字符串转换为另一个字符串所需的最小编辑距离。下面是对代码的清晰、简洁和易读的解释:
- 首先,获取两个输入字符串的长度n和m。
- 如果其中一个字符串为空串,则返回另一个字符串的长度作为编辑距离。
- 创建一个二维数组D,用于存储动态规划的中间结果,数组大小为(n+1) x (m+1)。
- 初始化边界状态:将第一行和第一列分别设置为0到n和0到m。
- 开始计算所有的DP值:
- 对于每个位置(i, j),计算三种操作的代价:插入、删除和替换。
- 左边的值加1代表插入操作,上面的值加1代表删除操作,左上角的值加1代表替换操作。
- 如果当前位置的字符相同,则左上角的值不需要额外操作,否则需要加1。
- 更新当前位置的DP值为三种操作中的最小值。
- 最后返回D[n][m],即两个字符串之间的最小编辑距离。
这段代码实现了经典的编辑距离算法,通过动态规划的方式高效地计算出两个字符串之间的最小编辑距禿。
参考代码:
package 代码随想录.动态规划;
public class _72编辑距离_二维dp {
/**
* 每一个节点位置都当做没有or可以任意配对去处理。
*
* @param word1
* @param word2
* @return
*/
public int minDistance(String word1, String word2) {
int len_w1 = word1.length();
int len_w2 = word2.length();
//防止存在空串而去复杂计算
if (len_w1 * len_w2 == 0){
return len_w1 + len_w2;
}
int [][] dp = new int[len_w1 + 1][len_w2 + 1];
//对数组进行初始化,初始从【 1 】开始?
for (int i = 1;i<=len_w1;i++){
dp[i][0] = i;
}
for (int j = 1;j<=len_w2;j++){
dp[0][j] = j;
}
//每个地方都去寻找一个恰当的位置
for (int i = 1;i<=len_w1;i++) {
for (int j = 1; j <= len_w2; j++) {
int leftDP = dp[i-1][j] + 1;
int upDP = dp[i][j-1] + 1;
int leftAndUpDP = dp[i-1][j-1];
//因为dp数组有效位从1开始
//所以当前遍历到的字符串的位置为i-1 | j-1
if (word1.charAt(i-1) != word2.charAt(j-1)){
leftAndUpDP += 1;
}
dp[i][j] = Math.min(leftDP,Math.min(upDP,leftAndUpDP));
}
}
return dp[len_w1][len_w2];
}
}