72. Edit Distance(编辑距离)
题目大意
Given two strings word1
and word2
, return the minimum number of operations required to convert word1
to word2
.
You have the following three operations permitted on a word:
- Insert a character
- Delete a character
- Replace a character
中文释义
给定两个字符串 word1
和 word2
,返回将 word1
转换为 word2
所需的最少操作次数。
你可以对一个单词执行以下三种操作:
- 插入一个字符
- 删除一个字符
- 替换一个字符
示例
- 示例 1:
- 输入:
word1 = "horse"
,word2 = "ros"
- 输出:
3
- 解释:
- horse -> rorse (将 ‘h’ 替换为 ‘r’)
- rorse -> rose (移除 ‘r’)
- rose -> ros (移除 ‘e’)
- 输入:
- 示例 2:
- 输入:
word1 = "intention"
,word2 = "execution"
- 输出:
5
- 解释:
- intention -> inention (移除 ‘t’)
- inention -> enention (将 ‘i’ 替换为 ‘e’)
- enention -> exention (将 ‘n’ 替换为 ‘x’)
- exention -> exection (将 ‘n’ 替换为 ‘c’)
- exection -> execution (插入 ‘u’)
- 输入:
限制条件
0 <= word1.length, word2.length <= 500
word1
和word2
由小写英文字母组成。
解题思路
使用动态规划(DP)来解决问题。创建一个二维 dp
数组来存储将 word1
的前 i
个字符转换为 word2
的前 j
个字符所需的最少操作数。
步骤说明
- 初始化一个二维
dp
数组,其中dp[i][j]
表示将word1
的前i
个字符转换为word2
的前j
个字符所需的最少操作数。 - 初始化
dp
数组的第一行和第一列,因为将任何字符串转换为空字符串或从空字符串转换到任何字符串都只需要相应长度的操作数。 - 对于每个
i
和j
,计算dp[i][j]
:- 如果
word1[i - 1] == word2[j - 1]
,则不需要任何额外操作。 - 否则,取插入、删除和替换操作中的最小值,并加上 1(代表当前操作)。
- 如果
- 返回
dp[length1][length2]
作为结果。
代码
class Solution {
public:
int minDistance(string word1, string word2) {
int length1 = word1.length(), length2 = word2.length();
vector<vector<int>> dp(length1 + 1, vector<int>(length2 + 1, 0));
for (int i = 0; i <= length1; i++) dp[i][0] = i;
for (int j = 0; j <= length2; j++) dp[0][j] = j;
for (int i = 1; i <= length1; i++) {
for (int j = 1; j <= length2; j++) {
if (word1[i - 1] == word2[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;
}
}
}
return dp[length1][length2];
}
};