72. Edit Distance
Given two words word1 and word2, find the minimum number of operations required to convert word1 to word2.
You have the following 3 operations permitted on a word:
- Insert a character
- Delete a character
- Replace a character
Example 1:
Input: word1 = "horse", word2 = "ros"
Output: 3
Explanation:
horse -> rorse (replace 'h' with 'r')
rorse -> rose (remove 'r')
rose -> ros (remove 'e')
Example 2:
Input: word1 = "intention", word2 = "execution"
Output: 5
Explanation:
intention -> inention (remove 't')
inention -> enention (replace 'i' with 'e')
enention -> exention (replace 'n' with 'x')
exention -> exection (replace 'n' with 'c')
exection -> execution (insert 'u')
题目:给定两个字符串word1
和word2
,计算将word1
转变为word2
所需的最小操作数。其中,只可以对word1
(或者是已经修改后的word1
)采用三种操作:替换为word2
对应位置上的元素,删除word1
某个位置上的元素,在word1
某个位置上插入元素。
思路:参见分析。为了确定word1
变为word2
需要的最小操作数,可以先计算两个字符串子集间转换所需的最少操作数。记dp[i][j]
表示word1
的子集word1[1,...,i]
转换为word2[1,...,j]
所需要的最小操作数。
为了使word1[1,...,i]
转换为word2[1,...,j]
,存在两种情况。
如果word1[i] = word2[j]
,那么dp[i][j] = dp[i-1][j-1]
。
如果不相等,考虑允许的三种操作,使得满足word1[1,...,i] = word2[1,...,j]
:
-
交换,将
word1[i]
的值替换为word2[j]
的值,dp[i][j] = dp[i-1][j-1] + 1
; -
删除,将
word1[i]
的值删除后,word1[1,...,i-1]
转化为word2[1,...,j]
所需的操作为dp[i-1][j]
,此时dp[i][j] = dp[i-1][j] + 1
; -
插入,在
word1[i]
之后插入word2[j]
后,满足word1[1,...,i]
+word2[j]
等于word2[1,...,j]
,即应使得word1[1,...,i]
等于word2[1,...,j-1]
,那么需要的操作数为dp[i][j] = dp[i][j-1] + 1
。
边界条件的确定可以看成是word1
变成空字符串(word2=""
)所需的最少操作数(删除),以及空字符(word1=""
)变成word2
所需的最小操作数(插入)。
注意:为了方便处理边界条件,dp
的大小设置为dp[r+1][c+1]
,在实际代码中用dp[i+1][j+1]
表示word1
的子集word1[1,...,i]
转换为word2[1,...,j]
所需要的最小操作数。
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
int minDistance(string word1, string word2) {
int r = word1.size();
int c = word2.size();
vector<vector<int>> dp(r + 1, vector<int>(c + 1));
//边界条件初始化,如果word2为空时
for (int i = 0; i <= r; ++i)
dp[i][0] = i;
//如果word1为空时
for (int j = 0; j <= c; ++j)
dp[0][j] = j;
for (int i = 1; i <= r; ++i) {
for (int j = 1; j <= c; ++j) {
if (word1[i - 1] == word2[j - 1])
dp[i][j] = dp[i - 1][j - 1];
else
dp[i][j] = min(min(dp[i - 1][j - 1] + 1, dp[i - 1][j] + 1), dp[i][j - 1] + 1);
}
}
return dp[r][c];
}
};
int main()
{
Solution sln;
cout << sln.minDistance("horse", "ros") << endl;
std::cout << "Hello World!\n";
}