题意:
解题思路:
思路:
状态定义: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的+1
2. 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
}