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.

1. dp[i][j]: the minimum number of times to deleted a letter。
the string word1 that ends in i-1
the string word2 that ends in j-1
2. recursive formula
When word1[i - 1] and word2[j - 1] are the same
When word1[i - 1] and word2[j - 1] are not the same
When word1[i - 1] is the same as word2[j - 1], dp[i][j] = dp[i - 1][j - 1];
When word1[i - 1] is not the same as word2[j - 1], there are three cases:
Case 1: delete word1[i - 1], the minimum number of operations is dp[i - 1][j] + 1
Case 2: delete word2[j - 1], the minimum number of operations is dp[i][j - 1] + 1
**Case 3:**delete word1[i - 1] and word2[j - 1] at the same time, the minimum number of operations for dp[i - 1][j - 1] + 2
then finally of course the minimum value, so when word1[i - 1] and word2[j - 1] are not the same, recursive formula: dp[i][j] = min({dp[i - 1][j - 1] + 2, dp[i - 1][j] + 1, dp[i][j - 1] + 1});
Since dp[i][j - 1] + 1 = dp[i - 1][j - 1] + 2, the recursive formula can be simplified to
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + 1;
DP:
Time complexity: O(m x n)
Space complexity: O(m x n)
python
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
m = len(word1)
n = len(word2)
dp = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(m + 1): # m+1 不是 m
dp[i][0] += i
for j in range(n + 1):
dp[0][j] += j
for i in range(1, m + 1):
for j in range(1, n + 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], dp[i][j - 1]) + 1#dp[i][j] = min(dp[i-1][j-1] + 2, dp[i-1][j] + 1, dp[i][j-1] + 1)
return dp[-1][-1]
Given two strings word1 and word2, return the minimum number of operations required to convert word1 to word2.
You have the following three operations permitted on a word:
- Insert a character
- Delete a character
- Replace a character



recursive formula:
if (word1[i - 1] == word2[j - 1])
不操作 dp[i][j] = dp[i - 1][j - 1]
if (word1[i - 1] != word2[j - 1])
增 dp[i][j] = dp[i - 1][j] + 1,dp[i][j] = dp[i][j - 1] + 1 Adding an element to word2 is equivalent to removing an element from word1
删 dp[i][j] = dp[i - 1][j] + 1,dp[i][j] = dp[i][j - 1] + 1
换 dp[i][j] = dp[i - 1][j - 1] + 1
DP:
Time complexity: O(m x n)
Space complexity: O(m x n)
python
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
m = len(word1)
n = len(word2)
dp = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(m + 1):
dp[i][0] = i
for j in range(n + 1):
dp[0][j] = j
for i in range(1, m + 1):
for j in range(1, n + 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] + 1, dp[i - 1][j] + 1, dp[i][j - 1] + 1)
return dp[-1][-1]