思路源自:力扣题解
-
首先我们先初始化dp[0][0],物理意义是字符串“ ”变成字符串“ ”需要进行代价为0的转换
-
初始化第一行,物理意义:空字符串变成a的添加操作代价,空字符串变成ap的添加操作代价…空字符串变成apple的添加操作代价
-
初始化第一列,物理意义:字符串o变成空字符串的删除操作代价,字符串op变成空字符串的删除操作代价…字符串Oppa变成空字符串的删除操作代价
-
分两种情况:word1[i-1]和word2[j-1]相等或者不相等。先讨论不相等的情况:如上图的红色框、黑色框、蓝色框和黄色框。
-
红色框,因为o!=a,那么它的dp值的物理意义是:字符串o变成字符串a需要的最小转换代价。它的值可以来自左上方、左方、上方。取三种的最小值来对dp[i][j]赋值。1.左上方的物理意义:空字符串经过代价为0的转换操作已经变成为空字符串,所以字符串o变成字符串a需要只需要进行更新操作即可;2.左方的物理意义:o已经经过代价为1的操作转换变成空字符串,若想变成字符串a只需要进行插入操作就行;3.上方的物理意义:空字符串已经经过代价为1的操作转换变成字符串a,若想变成字符串a只需要讲o这个字符删除即可。最后我们选出三种方案得出的最小值作为当前红色框的dp值。
-
黑色框,因为o!=p:dp的物理意义:字符串o变成字符串ap需要的最小转换代价。1.左上方的物理意义:空字符串经过代价为1的转换操作已经变成字符串a(前面已经一样了,即:word1的ao和word2的ap),字符串ao若想变成字符串ap只需要进行更新操作就行;2.左方的物理意义:字符串o已经经过代价为1的转换操作变成了a,若想变成字符串ap只需要进行插入操作即可;3.上方的物理意义:空字符串已经经过代价为2的转换操作变成了ap,现在只需要将字符串o删除即可。最后取三者的最小值赋值给黑色框就行。
-
黄色框,1.左上方的物理意义:字符串o经过代价为1的转换操作已经变成空字符串,字符串p转换成a只需要进行替换操作即可;2.左方的物理意义:op已经经过代价为2操作变成空字符串,想要变成字符串a只需进行插入操作即可;3.上方的物理意义:字符串o经过代价为1的转换操作已经变成字符串a,现在只需要将字符串p删除即可得到字符串a。
-
相等的情况:看到白色框,p和p相等,直接从左上方复制dp值过来,物理意义是:字符串o经过代价为1的转换操作已经变成字符串a了,既然p和p都相等了,那么我们就不需要任何代价将ap变成ap了。
总结
不相等的情况下----左上:替换、左:插入、上:删除
class Solution {
private int min(int a, int b, int c) {//三数的最小值
return Math.min(a, Math.min(b, c));
}
public int minDistance(String word1, String word2) {
//定义三种操作的代价值
int insert=1;
int delete=1;
int replace=1;
//行列
int rows=word1.length();
int coloums=word2.length();
if(rows==0) return word2.length()*insert;
if(coloums==0) return word1.length()*delete;
//dp数组表示str1[0...i-1]转换为str2[0...j-1]所需要的最小转换代价
int dp[][] = new int[rows+1][coloums+1];
//表示空字符串经过0次转换代价变成空字符串
dp[0][0]=0;
for (int col=1; col<=coloums; col++) {
//初始化第一行:空字符串变成a的添加操作代价,空字符串变成ap的添加操作代价...空字符串变成apple的添加操作代价
dp[0][col] = col*insert;
}
for(int row=1; row<=rows; row++) {
//初始化第一列:字符串O变成空字符串的删除操作代价,字符串Op变成空字符串的删除操作代价...字符串Oppa变成空字符串的删除操作代价
dp[row][0] = row*delete;
}
for (int row=1; row<=rows; row++) {
for (int col=1; col<=coloums; col++) {
if (word1.charAt(row-1) == word2.charAt(col-1)) {
//两字符相等直接从左上角复制
dp[row][col] = dp[row-1][col-1];
} else {
//取三者最小代价赋值给dp[i][j]
dp[row][col] = min(dp[row-1][col-1]+replace, dp[row-1][col]+delete, dp[row][col-1]+insert);
}
}
}
return dp[rows][coloums];
}
}