72. Edit Distance

最小编辑距离,从原来的字符串至少要经过多少次操作才能够变成目标字符串,操作包括删除一个字符、插入一个字符、更新一个字符

思路:动态规划,用dp[i][j]表示word1[:i]到word2[:j]的最小编辑距离,显然 dp[0][j] = j, dp[i][0] = i,
dp[i][j]有三种情况:

  • 如果word1[i] == word2[j], 则等于dp[i-1][j-1], 否则等于dp[i-1][j-1] + 1, 即增加一个替换
  • 等于dp[i-1][j] + 1, 即word1[:i-1]转化为word2[:j]的基础上删除word1[i]就行了
  • 等于dp[i][j-1] + 1, 即word1[:i]转化为word[:j-1]的基础上再添加一个word2[j]就可以了

所以,状态转移方程是:dp[i][j] = dp[i-1][j-1] if word1[i-1] == word2[j-1] else min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution:
def minDistance(self, word1, word2):
"""
:type word1: str
:type word2: str
:rtype: int
"""
# 动态规划,6 star, 没有掌握,需多练
len1 = len(word1)
len2 = len(word2)
dp = [[0 for _ in range(len2+1)] for _ in range(len1+1)]
for i in range(len1+1):
dp[i][0] = i
for j in range(len2+1):
dp[0][j] = j
for i in range(1, len1+1):
for j in range(1, len2+1):
dp[i][j] = dp[i-1][j-1] if word1[i-1] == word2[j-1] else min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1
return dp[-1][-1]