题意:
解题思路:
思路:状态定义:D[i][j] 表示 word1 的前 i 个字母和 word2 的前 j 个字母之间的编辑距离。1. 当 word1[i] == word2[j],dp[i][j] = dp[i-1][j-1];2. 相当于最后一位是一样的,这一位就不用操作,只看前面的就行转移方程:当 word1[i] != word2[j],dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1最后一位不一样,3种方法:1. dp[i-1][j-1] 表示替换操作,只需要直接替换最后一位就行,这时就是前i-1 j-1的+12. dp[i-1][j]删除操作, hors horse 前4个 前5个 ,只要删一个就行3. dp[i][j-1] 表示插入操作,horse hors,插入一个s返回dp[-1][-1]
PHP代码实现:
class Solution { /** * @param String $word1 * @param String $word2 * @return Integer */ function minDistance($word1, $word2) { $m = strlen($word1); $n = strlen($word2); $dp = []; for ($i = 0; $i <= $m; $i++) { $dp[$i][0] = $i; } for ($j = 0; $j <= $n; $j++) { $dp[0][$j] = $j; } for ($i = 1; $i <= $m; $i++) { for ($j = 1; $j <= $n; $j++) { if ($word1[$i - 1] == $word2[$j - 1]) { $dp[$i][$j] = $dp[$i - 1][$j - 1]; } else { $dp[$i][$j] = 1 + min($dp[$i-1][$j], $dp[$i][$j-1], $dp[$i-1][$j-1]); } } } return $dp[$m][$n]; }}
GO代码实现:
func minDistance(word1 string, word2 string) int { m, n := len(word1), len(word2) if m == 0 && n != 0 || m != 0 && n == 0 { return 1 } if m == 0 || n == 0 { return 0 } dp := make([][]int, m + 1) for i := range dp { dp[i] = make([]int, n + 1) } for i := 1; i <= m; i++ { dp[i][0] = i } for j := 1; j <= n; j++ { dp[0][j] = j } for i := 1; i <= m; i++ { for j := 1; j <= n; j++ { if word1[i - 1] == word2[j - 1] { dp[i][j] = dp[i - 1][j - 1] } else { dp[i][j] = Min(dp[i - 1][j - 1], Min(dp[i][j - 1], dp[i - 1][j])) + 1 } } } return dp[m][n]}func Min(a, b int) int { if a > b { return b } return a}