题意:

image.png

解题思路:

  1. 思路:
  2. 状态定义:D[i][j] 表示 word1 的前 i 个字母和 word2 的前 j 个字母之间的编辑距离。
  3. 1. word1[i] == word2[j],dp[i][j] = dp[i-1][j-1];
  4. 2. 相当于最后一位是一样的,这一位就不用操作,只看前面的就行
  5. 转移方程:
  6. word1[i] != word2[j],
  7. dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1
  8. 最后一位不一样,3种方法:
  9. 1. dp[i-1][j-1] 表示替换操作,只需要直接替换最后一位就行,这时就是前i-1 j-1的+1
  10. 2. dp[i-1][j]删除操作, hors horse 4 5 ,只要删一个就行
  11. 3. dp[i][j-1] 表示插入操作,horse hors,插入一个s
  12. 返回dp[-1][-1]

PHP代码实现:

  1. class Solution {
  2. /**
  3. * @param String $word1
  4. * @param String $word2
  5. * @return Integer
  6. */
  7. function minDistance($word1, $word2) {
  8. $m = strlen($word1);
  9. $n = strlen($word2);
  10. $dp = [];
  11. for ($i = 0; $i <= $m; $i++) {
  12. $dp[$i][0] = $i;
  13. }
  14. for ($j = 0; $j <= $n; $j++) {
  15. $dp[0][$j] = $j;
  16. }
  17. for ($i = 1; $i <= $m; $i++) {
  18. for ($j = 1; $j <= $n; $j++) {
  19. if ($word1[$i - 1] == $word2[$j - 1]) {
  20. $dp[$i][$j] = $dp[$i - 1][$j - 1];
  21. } else {
  22. $dp[$i][$j] = 1 + min($dp[$i-1][$j], $dp[$i][$j-1], $dp[$i-1][$j-1]);
  23. }
  24. }
  25. }
  26. return $dp[$m][$n];
  27. }
  28. }

GO代码实现:

  1. func minDistance(word1 string, word2 string) int {
  2. m, n := len(word1), len(word2)
  3. if m == 0 && n != 0 || m != 0 && n == 0 {
  4. return 1
  5. }
  6. if m == 0 || n == 0 {
  7. return 0
  8. }
  9. dp := make([][]int, m + 1)
  10. for i := range dp {
  11. dp[i] = make([]int, n + 1)
  12. }
  13. for i := 1; i <= m; i++ {
  14. dp[i][0] = i
  15. }
  16. for j := 1; j <= n; j++ {
  17. dp[0][j] = j
  18. }
  19. for i := 1; i <= m; i++ {
  20. for j := 1; j <= n; j++ {
  21. if word1[i - 1] == word2[j - 1] {
  22. dp[i][j] = dp[i - 1][j - 1]
  23. } else {
  24. dp[i][j] = Min(dp[i - 1][j - 1], Min(dp[i][j - 1], dp[i - 1][j])) + 1
  25. }
  26. }
  27. }
  28. return dp[m][n]
  29. }
  30. func Min(a, b int) int {
  31. if a > b { return b }
  32. return a
  33. }