583. 两个字符串的删除操作
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
# dp[i][j]表示子串word1[:i+1]和word2[:j+1]相同所需要最小步数。
# 如果word1[i]与word2[j]相等,那么dp[i][j] = dp[i-1][j-1]
# 如果word1[i]与word2[j]不相等,那么dp[i][j] = min(dp[i-1][j], dp[i][j-1])
word1 = list(word1)
word2 = list(word2)
dp = [[0] * (len(word1) + 1) for _ in range(len(word2) + 1)]
for i in range(1, len(word1) + 1):
dp[0][i] = i
for j in range(1, len(word2) + 1):
dp[j][0] = j
for i in range(1, len(word2) + 1):
for j in range(1, len(word1) + 1):
if word2[i - 1] == word1[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)
# print(dp)
return dp[-1][-1]
记得如果不相等有三种情况,要么都删,要么删一个,但是这也是操作,所以要计数。 另外初始化要实事求是,直觉删多少次就设置多少次。
72. 编辑距离
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
# dp[i][j]表示子串word1[:i+1]和word2[:j+1]相同所需要最小步数。
# 如果word1[i]与word2[j]相等,那么dp[i][j] = dp[i-1][j-1]
# 如果word1[i]与word2[j]不相等,那么dp[i][j] = min(dp[i-1][j], dp[i][j-1])
word1 = list(word1)
word2 = list(word2)
dp = [[0] * (len(word1) + 1) for _ in range(len(word2) + 1)]
for i in range(1, len(word1) + 1):
dp[0][i] = i
for j in range(1, len(word2) + 1):
dp[j][0] = j
for i in range(1, len(word2) + 1):
for j in range(1, len(word1) + 1):
if word2[i - 1] == word1[j - 1]:
dp[i][j] = dp[i - 1][j - 1]
else:
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1
# print(dp)
return dp[-1][-1]
word2添加一个元素,相当于word1删除一个元素,例如 word1 = "ad" ,word2 = "a",word1删除元素'd' 和 word2添加一个元素'd',变成word1="a", word2="ad", 最终的操作数是一样!
只需要一次替换的操作,就可以让 word1[i - 1] 和 word2[j - 1] 相同。