清单
● 583. 两个字符串的删除操作
● 72. 编辑距离
LeetCode #583 两个字符串的删除操作
1. 题目
给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。
2. 思路
- dp数组的含义: 使word1[i-1]和word2[j-1]相同所需的最小步数
- 递推公式:
- word [i-1] == word2[j-1], dp[i][j] = dp[i-1][j-1]
- word [i-1] != word2[j-1] --> 3种情况
-
- word1 删除一个字符,word1 [i-1] = word2 [j] --> dp[i][j] = dp[i-1][j] + 1
-
- word2 删除一个字符, word 2[j-1] = word1[i] --> dp[i][j] = dp[i][j-1] + 1
-
- word1 & word2 同时删除一个字符串, dp[i][j] = dp[i-1][j-1] + 2
- 初始化 ----> dp[i][0] = i dp[0][j] = j
- 遍历顺序: 从上到下 从左往右
3. 代码实现
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
#Initial dp
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 编辑距离
1. 题目
给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数。
你可以对一个单词进行如下三种操作:
- 插入一个字符
- 删除一个字符
- 替换一个字符
2. 思路
- dp数组的含义: 使word1[i-1]和word2[j-1]相同所需的最小步数
- 递推公式:
- word [i-1] == word2[j-1], dp[i][j] = dp[i-1][j-1]
- word [i-1] != word2[j-1] --> 3种情况
-
- word1 删除一个字符,word1 [i-1] = word2 [j] --> dp[i][j] = dp[i-1][j] + 1
-
- word2 删除一个字符, word 2[j-1] = word1[i] --> dp[i][j] = dp[i][j-1] + 1
-
- 替换一个字符串, dp[i][j] = dp[i-1][j-1] + 1
- 初始化 ----> dp[i][0] = i dp[0][j] = j
- 遍历顺序: 从上到下 从左往右
3. 代码实现
#Initial dp
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]