https://leetcode.cn/problems/edit-distance/
给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
插入一个字符
删除一个字符
替换一个字符
示例 1:
输入:word1 = “horse”, word2 = “ros”
输出:3
解释:
horse -> rorse (将 ‘h’ 替换为 ‘r’)
rorse -> rose (删除 ‘r’)
rose -> ros (删除 ‘e’)
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
# 难度:☆☆☆
# 方法:动态规划
# ① 定义dp:dp[i][j]:以i - 1为下标的word1,以j - 1为下标的word2,word1转换成word2所使用的最少操作次数
m, n = len(word1), len(word2)
dp = [[0] * (n + 1) for _ in range(m + 1)]
# ② 初始化
for i in range(m + 1):
dp[i][0] = i
for j in range(n + 1):
dp[0][j] = j
dp[0][0] = 0
# ③ 遍历递归(状态转移方程)
for i in range(1, m + 1):
for j in range(1, n + 1):
if word1[i - 1] == word2[j - 1]:
dp[i][j] = dp[i - 1][j - 1]
else:
# 增:dp[i][j] = dp[i][j - 1] + 1
# 删:dp[i][j] = dp[i - 1][j] + 1
# 改:dp[i][j] = dp[i - 1][j - 1] + 1
dp[i][j] = min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1
return dp[-1][-1]