583. 两个字符串的删除操作
给定两个单词 word1
和 word2
,返回使得 word1
和 word2
相同所需的最小步数。
每步 可以删除任意一个字符串中的一个字符。
解题思路:
确认dp数组含义:dp[i][j]以i-1为结尾的word1子数和以j-1为结尾的word2子数串相同的最小步数
dp公式: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)
初始化:dp[i][0] = i, dp[0][j] = j要变成一样的需要删掉所有字符
遍历顺序:从上到下,从左到右
打印dp数组
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[len(word1)][len(word2)]
72. 编辑距离
给你两个单词 word1
和 word2
, 请返回将 word1
转换成 word2
所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
- 插入一个字符
- 删除一个字符
- 替换一个字符
解题思路:
确认dp含义:dp[i][j]使以i-1 word1子数串和j-1结尾的word2子数串相同的最小操作word1次数
dp公式:word1[i-1] == word2[j-1]: dp[i][j] = dp[i-1][j-1], else: 删除word1不相同的i-1元素,在word2添加元素,替换word1或word2元素
初始化:dp[i][0] = i, dp[0][j] = j
遍历顺序:从上到下从左到右
打印dp数组
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[len(word1)][len(word2)]
编辑距离总结篇
来源:
题目: