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.

题目大意 #

给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。

解题思路 #

  • 从题目数据量级判断,此题一定是 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][0] = i
	}
	for i := 0; i < len(word2)+1; i++ {
		dp[0][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
}

⬅️上一页

下一页➡️

Calendar Jun 16, 2021
Edit Edit this page
本站总访问量:  次 您是本站第  位访问者