题目链接:https://leetcode-cn.com/problems/edit-distance/
难度:困难
描述:
给你两个单词 word1
和 word2
, 请返回将 _word1_
转换成 _word2_
所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
- 插入一个字符
- 删除一个字符
- 替换一个字符
提示:
word1, word2范围:[0, 500]
题解
设r[i][j]
是word1
前i
个字符转换成word2
前j
个字符所需的最少操作数
- 当
i == 0 or j == 0
:那么操作只会是插入(i == 0
)或删除(j == 0
),那么r[0][j] = j
,r[i][0] = i
。 当
r != 0 and j != 0
时,所对应的三种操作:- 插入:
r[i][j] = r[i][j-1] + 1
- 删除:
r[i][j] = r[i-1][j] + 1
替换:
r[i][j] = r[i-1][j-1] + 1
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
m, n = len(word1), len(word2)
r = [[0] * (n+1) for i in range(m+1)]
for i in range(m+1):
r[i][0] = i
for j in range(n+1):
r[0][j] = j
for i in range(1, m+1):
for j in range(1, n+1):
r[i][j] = min(r[i-1][j], r[i][j-1], r[i-1][j-1]) + 1
# 当前字符相等,只需改动前面i-1个字符
if word1[i-1] == word2[j-1]:
r[i][j] = min(r[i][j], r[i-1][j-1])
return r[m][n]
- 插入: