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]; } }
|