class Solution {    public int minDistance(String word1, String word2) {        int n = word1.length();        int m = word2.length();        // 有一个字符串为空串        if (n * m == 0) {            return n + m;        }        // DP 数组        int[][] D = new int[n + 1][m + 1];        // 边界状态初始化        for (int i = 0; i < n + 1; i++) {            D[i][0] = i;        }        for (int j = 0; j < m + 1; j++) {            D[0][j] = j;        }        // 计算所有 DP 值        for (int i = 1; i < n + 1; i++) {            for (int j = 1; j < m + 1; j++) {                int left = D[i - 1][j] + 1;                int down = D[i][j - 1] + 1;                int left_down = D[i - 1][j - 1];                if (word1.charAt(i - 1) != word2.charAt(j - 1)) {                    left_down += 1;                }                D[i][j] = Math.min(left, Math.min(down, left_down));            }        }        return D[n][m];    }}
class Solution:    def minDistance(self, word1: str, word2: str) -> int:        m, n = len(word1), len(word2)        dp = [[-1] * (n + 1) for _ in range(m + 1)]        def dp_dist(i, j):            if dp[i][j] >= 0:                return dp[i][j]            if i * j == 0:                dp[i][j] = i + j                      elif word1[i - 1] == word2[j - 1]:                dp[i][j] = dp_dist(i - 1, j - 1)            else:                dp[i][j] = 1 + min(dp_dist(i - 1, j), dp_dist(i, j - 1), dp_dist(i - 1, j - 1))            return dp[i][j]        return dp_dist(m, n)
class Solution {public:    int minDistance(string word1, string word2) {        int n = word1.size(), m = word2.size();        word1 = ' ' + word1;  //添加空格        word2 = ' ' + word2;        vector<vector<int>>f(n + 1, vector<int>(m + 1));        for(int i = 0; i <= n; i++)  f[i][0] = i;  //i次删除        for(int i = 0; i <= m; i++)  f[0][i] = i;  //i次删除 word1 -> word2        for(int i = 1; i <= n; i++)            for(int j = 1; j <= m; j++){                f[i][j] = min(f[i - 1][j], f[i][j - 1]) + 1;      //添加或者删除                if(word1[i] == word2[j]) f[i][j] = min(f[i][j], f[i - 1][j - 1]);                else f[i][j] = min(f[i][j], f[i - 1][j - 1] + 1); //替换            }        return f[n][m];        }};