題目
給定兩個單詞 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步數。每步可以刪除任意一個字符串中的一個字符。
例:
輸入: word1 = "sea", word2 = "eat"
輸出: 2
解釋: 第一步將 "sea" 變為 "ea" ,第二步將 "eat "變為 "ea"
方法:動態規劃
思路同 115. 不同的子序列,區別在于該題左右兩邊的字符串均可以進行刪除操作
dp[i][j] 表示以 i-1 為結尾的單詞 word1 和以 j-1 為結尾的單詞 word2 達到相同所需的最小步數
-
初始化
- dp[i][0] 表示以 i-1 為結尾的單詞 word1 和以 -1 為結尾的單詞 word2 達到相同所需的最小步數,即為以 i-1 為結尾的單詞 word1 和空字符串達到相同所需的最小步數,所以設置為 i
- dp[0][j] 表示以 -1 為結尾的單詞 word1 和以 j-1 為結尾的單詞 word2 達到相同所需的最小步數,即為空字符串和以 j-1 為結尾的單詞 word2 達到相同所需的最小步數,所以設置為 j
-
外部循環表示對單詞 word1 的循環,內部循環表示對單詞 word2 的循環
- 若兩個單詞的字符相同,即 word1[i-1] == word2[j-1],那么此時結尾的字符并不需要被刪除,因此此時兩個字符串達到相同所需的最小步數即為以 i-2 為結尾的 word1 和以 j-2 為結尾的 word2 達到相同所需的最小步數 dp[i-1][j-1]
- 若兩個單詞的字符不同,即 word1[i-1] ≠ word2[j-1],那么此時結尾的字符需要被刪除,刪除的方式有三種:刪除 word1[i-1],即 word2[j-1] 可以同 word1 中字符相匹配,那么此時 dp[i][j] 等于 word1[0, i-2] 和 word2[0, j-1] 達到相同所需的最小步數 dp[i-1][j] 加一;刪除 word2[j-1],即 word1[i-1] 可以同 word2 中字符相匹配,那么此時 dp[i][j] 等于 word1[0, i-1] 和 word2[0, j-2] 達到相同所需的最小步數 dp[i][j-1] 加一;同時刪除 word1[i-1] 和 word2[j-1],即兩個字符均無法相匹配,那么此時 dp[i][j] 等于 word1[0, i-2] 和 word2[0, j-2] 達到相同所需的最小步數 dp[i-1][j-1] 加二
※ 因為求的是最小步數,那么應選擇三種方式的最小值
class Solution(object):
def minDistance(self, word1, word2):
dp = [[0] * (len(word2)+1) for row in range(len(word1)+1)]
for i in range(len(word1)+1):
dp[i][0] = i
for j in range(1, len(word2)+1):
dp[0][j] = j
for i in range(1, len(word1)+1):
for j in range(1, len(word2)+1):
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, dp[i][j-1]+1, dp[i-1][j-1]+2)
return dp[-1][-1]