给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:
- 示例 1:
输入:word1 = “horse”, word2 = “ros”,输出:3
解释:
- horse -> rorse (将 ‘h’ 替换为 ‘r’)
- rorse -> rose (删除 ‘r’)
- rose -> ros (删除 ‘e’)
- 示例 2:
输入:word1 = “intention”, word2 = “execution”,输出:5
解释:
- intention -> inention (删除 ‘t’)
- inention -> enention (将 ‘i’ 替换为 ‘e’)
- enention -> exention (将 ‘n’ 替换为 ‘x’)
- exention -> exection (将 ‘n’ 替换为 ‘c’)
- exection -> execution (插入 ‘u’)
动态规划解法:
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
| object MinDistance { def main(args: Array[String]): Unit = { println(minDistance("horse", "ros")) }
def minDistance(word1: String, word2: String): Int = { val m = word1.length val n = word2.length
val dp = new Array[Array[Int]](m + 1) for (i <- 0 to m) { dp(i) = new Array[Int](n + 1) dp(i)(0) = i if (i == 0) { for (j <- 0 to n) { dp(0)(j) = j } } } for (i <- 1 to m) { for (j <- 1 to n) { dp(i)(j) = Math.min( Math.min(dp(i - 1)(j) + 1, dp(i)(j - 1) + 1), if (word1.charAt(i - 1) == word2.charAt(j - 1)) dp(i - 1)(j - 1) else dp(i - 1)(j - 1) + 1 ) } }
dp(m)(n) } }
|