Brute Force
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
return self.dfs(word1, 0, word2, 0)
def dfs(self, w1, i1, w2, i2):
if i2==len(w2):
return len(w1)-i1
if i1==len(w1):
return len(w2)-i2
if w1[i1] == w2[i2]:
return self.dfs(w1, i1+1, w2, i2+1)
if w1[i1] != w2[i2]:
return 1+min(
# Insert or Delete
self.dfs(w1, i1+1, w2, i2),
self.dfs(w1, i1, w2, i2+1),
# Replace
self.dfs(w1, i1+1, w2, i2+1),
)
DP
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
n, m = len(word1), len(word2)
dp =[ [0]*(m+1) for i in range(n+1)]
for i in range(n+1):
dp[i][0] = i
for j in range(m+1):
dp[0][j] = j
for i in range(1, n+1):
for j in range(1, m+1):
if word1[i-1]==word2[j-1]:
dp[i][j] = dp[i-1][j-1]
else:
dp[i][j] = 1+min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])
return dp[n][m]