// 定义dp[i][j]: 表示word1前i个字符转换到word2前j个字符最小操作数
// 初始化dp[m+1][n+1]
class Solution {
public int minDistance(String word1, String word2) {
int m = word1.length();
int n = word2.length();
// 1. dp数组
int[][] dp = new int[m + 1][n + 1];
// 2. dp数组初始化, word1前0到m变成word2的前0个需要最少操作数
for (int i = 0; i <= m; i++) {
dp[i][0] = i;
}
// 反之
for (int j = 0; j <= n; j++) {
dp[0][j] = j;
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (word1.charAt(i - 1) == word2.charAt(j - 1)) { // 3.注意这里的dp含义,dp[1][1]表示word1前一个到word2前一个最少操作数据
dp[i][j] = dp[i - 1][j - 1]; // 4. 如果word1第一个和word2的第一个一样,那dp[1][1]不就等于dp[0][0]
} else {
dp[i][j] = Math.min(dp[i - 1][j], Math.min(dp[i - 1][j - 1], dp[i][j - 1])) + 1;
// 5. dp[i - 1][j]: 表示word1前i-1 word1再插入一个
// dp[i - 1][j - 1]: 表示word1前i-1 变为word2前j-1, 替换一个
// dp[i][j - 1]): 表示word1前i个, word2再插入一个
}
}
}
return dp[m][n];
}
}