Solution to LeetCode 583 Delete Operation for Two Strings and LeetCode 72 Edit Distance
LeetCode 583
Delete Operation for Two Strings (Medium) [link]
Define dp[i][j]
as the minimum number of deletion of word1[0:i-1] and word2[0:j-1] to make them the same.
Case1: word1[i-1]==word2[j-1]
. dp[i][j] = dp[i - 1][j - 1]
.
Case2: word1[i-1]!=word2[j-1]
. dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1, dp[i - 1][j-1]+2)
.
Initialize dp[i][0]
and dp[0][j]
. dp[i][0]=i
and dp[0][j]=j
.
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
dp = [[0]*(len(word2)+1) for _ in range(len(word1)+1)]
for i in range(len(word1)+1):
dp[i][0] = i
for j in range(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]
LeetCode 72
Edit Distance (Hard) [link]
We can Insert, delete, or replace a character.
Define dp[i][j]
as the minimum number of editions of word1[0:i-1] and word2[0:j-1] to make them the same.
Case 1: word1[i-1]==word2[j-1]
. We do nothing. dp[i][j] = dp[i - 1][j - 1]
.
Case 2: word1[i-1]!=word2[j-1]
. We do insert, delete, or replace. dp[i][j] = min({dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]}) + 1
.
The difference between LC72 and LC583 is that in LC72 we allow to replace a character so we don’t need to delete one character from both words.
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
dp = [[0]*(len(word2)+1) for _ in range(len(word1)+1)]
for i in range(len(word1)+1):
dp[i][0] = i
for j in range(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]+1)
return dp[-1][-1]