0583. Delete Operation for Two Strings

# 583. Delete Operation for Two Strings#

## 题目 #

Given two strings word1 and word2, return the minimum number of steps required to make word1 and word2 the same.

In one step, you can delete exactly one character in either string.

Example 1:

Input: word1 = "sea", word2 = "eat"
Output: 2
Explanation: You need one step to make "sea" to "ea" and another step to make "eat" to "ea".


Example 2:

Input: word1 = "leetcode", word2 = "etco"
Output: 4


Constraints:

• 1 <= word1.length, word2.length <= 500
• word1 and word2 consist of only lowercase English letters.

## 解题思路 #

• 从题目数据量级判断，此题一定是 O(n^2) 动态规划题。定义 dp[i][j] 表示 word1[:i]word2[:j] 匹配所删除的最少步数。如果 word1[:i-1]word2[:j-1] 匹配，那么 dp[i][j] = dp[i-1][j-1]。如果 word1[:i-1]word2[:j-1] 不匹配，那么需要考虑删除一次，所以 dp[i][j] = 1 + min(dp[i][j-1], dp[i-1][j])。所以动态转移方程是：

$dp[i][j] = \left\{\begin{matrix}dp[i-1][j-1]&, word1[i-1] == word2[j-1]\\ 1 + min(dp[i][j-1], dp[i-1][j])&, word1[i-1] \neq word2[j-1]\\\end{matrix}\right.$

最终答案存储在 dp[len(word1)][len(word2)] 中。

## 代码 #

package leetcode

func minDistance(word1 string, word2 string) int {
dp := make([][]int, len(word1)+1)
for i := 0; i < len(word1)+1; i++ {
dp[i] = make([]int, len(word2)+1)
}
for i := 0; i < len(word1)+1; i++ {
dp[i] = i
}
for i := 0; i < len(word2)+1; i++ {
dp[i] = i
}
for i := 1; i < len(word1)+1; i++ {
for j := 1; j < len(word2)+1; j++ {
if word1[i-1] == word2[j-1] {
dp[i][j] = dp[i-1][j-1]
} else {
dp[i][j] = 1 + min(dp[i][j-1], dp[i-1][j])
}
}
}
return dp[len(word1)][len(word2)]
}

func min(x, y int) int {
if x < y {
return x
}
return y
} Sep 18, 2021 Edit this page