72.编辑距离
给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
示例 1:
1 2 3 4 5 6
   | 输入:word1 = "horse", word2 = "ros" 输出:3 解释: horse -> rorse (将 'h' 替换为 'r') rorse -> rose (删除 'r') rose -> ros (删除 'e')
   | 
 
Solution
dp的状态转移方程:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
   | class Solution {          public int minDistance(String text1, String text2) {                  char[] s = text1.toCharArray(), t = text2.toCharArray();         int n = s.length, m = t.length;                   int[][] f = new int[n + 1][m + 1];
                   for (int j = 0; j <= m; ++j) f[0][j] = j;         for (int i = 0; i <= n; ++i) f[i][0] = i;                  for (int i = 0; i < n; ++i) {                          for (int j = 0; j < m; ++j) {                                  if (s[i] == t[j]) {                     f[i + 1][j + 1] = f[i][j];                 } else {                                          f[i + 1][j + 1] = Math.min(Math.min(f[i][j + 1], f[i + 1][j]), f[i][j]) + 1;                 }             }         }
                   return f[n][m];     } }
 
  | 
 
可以用一维dp数组来代替
在没有空间优化的版本里f[0] = list(range(m + 1))
也就是说最左边一列的值,自上而下分别为0 1 2 3 4 5 6 … 但优化成一个数组之后,最左边的那个值就需要自己手动累加了,否则一直都是0,那么“由短补长”或“由长补短”这两种情形内,必有一个答案是错的,要么是多出来的长度没计算删掉,要么是多出来的长度没计算补上f[0] += 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
   | class Solution {          public int minDistance(String text1, String text2) {         char[] t = text2.toCharArray();          int m = t.length;          int[] f = new int[m + 1]; 
                   for (int j = 1; j <= m; j++) f[j] = j;
                   for (char x : text1.toCharArray()) {             int pre = f[0];              ++f[0]; 
                           for (int j = 0; j < m; ++j) {                 int tmp = f[j + 1];                                                    f[j + 1] = x == t[j] ? pre : Math.min(Math.min(f[j + 1], f[j]), pre) + 1;                 pre = tmp;              }         }
                   return f[m];     } }
 
  |