编辑距离
题目介绍
给你两个单词 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')
|
示例2:
1 2 3 4 5 6 7 8
| 输入:word1 = "intention", word2 = "execution" 输出:5 解释: intention -> inention (删除 't') inention -> enention (将 'i' 替换为 'e') enention -> exention (将 'n' 替换为 'x') exention -> exection (将 'n' 替换为 'c') exection -> execution (插入 'u')
|
提示:
0 <= word1.length, word2.length <= 500
word1 和 word2 由小写英文字母组成
题目解法
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 32 33 34 35 36 37 38 39 40 41 42 43 44
| package algorithm;
public class EditDistance {
public static int minDistance(String word1, String word2) { int n = word1.length(); int m = word2.length();
if (n * m == 0) { return n + m; }
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; }
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]; }
public static void main(String[] args) { System.out.println(minDistance("horse", "ros")); System.out.println(minDistance("intention", "execution")); } }
|
打印:
思路:
思路是抄了官方答案,这个问题没遇到过,动态规划其实还简单了。