583 两个字符串的删除操作
题目链接:583
思路:
- 定义
dp[i][j]
代表使word1[0,i-1]
和word2[0,j-1]
相同的最小步数。 - 当
word1[i-1]==word2[j-1]
时,只需使word1[0,i-2]
等于word2[0,j-2]
,步数为dp[i-1][j-1]
;当word1[i-1]!=word2[j-1]
时,可以将word1[i-1]
删去,再使word1[0,i-2]
等于word2[0,j-1]
,步数为dp[i-1][j]+1
,也能将word2[j-1]
删去,再使word1[0,i-1]
等于word2[0,j-2]
,步数为dp[i][j-1]+1
,两者取小。 dp[i][0]
为将word1[0,i-1]
删空所需的次数i
,dp[0][j]
为将word2[0,j-1]
删空所需的次数j
。
代码:
class Solution {
public:
int minDistance(string word1, string word2) {
vector<vector<int>> dp(word1.size()+1, vector<int>(word2.size()+1, 0));
for (int i=0; i<=word1.size(); ++i) {
dp[i][0] = i;
}
for (int j=1; j<=word2.size(); ++j) {
dp[0][j] = j;
}
for (int i=1; i<=word1.size(); ++i) {
for (int j=1; j<=word2.size(); ++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]) + 1;
}
}
return dp[word1.size()][word2.size()];
}
};
72 编辑距离
题目链接:72
思路:
- 定义
dp[i][j]
代表将word1[0,i-1]
转化为word2[0,j-1]
的最少操作数。 - 当
word1[i-1]==word2[j-1]
时,只需将word1[0,i-2]
转为word2[0,j-2]
,步数为dp[i-1][j-1]
;当word1[i-1]!=word2[j-1]
时,有三种情况,取小:- 将
word1[i-1]
删去,再将word1[0,i-2]
转为word2[0,j-1]
,步数为dp[i-1][j]+1
。 - 在
word1[i-1]
后加一个word2[j-1]
,然后将word1[0,i-1]
转为word2[0,j-2]
,步数为dp[i][j-1]+1
。 - 将
word1[i-1]
换为word2[0,j-1]
,然后将word1[0,i-2]
转为word2[0,j-2]
,步数为dp[i-1][j-1]+1
。
- 将
dp[i][0]
为将word1[0,i-1]
删空所需的次数i
,dp[0][j]
为将空串增至word2[0,j-1]
所需的次数j
。
代码:
class Solution {
public:
int minDistance(string word1, string word2) {
vector<vector<int>> dp(word1.size()+1, vector<int>(word2.size()+1, 0));
for (int i=0; i<=word1.size(); ++i) {
dp[i][0] = i;
}
for (int j=1; j<=word2.size(); ++j) {
dp[0][j] = j;
}
for (int i=1; i<=word1.size(); ++i) {
for (int j=1; j<=word2.size(); ++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-1][j-1],dp[i][j-1]})+1;
}
}
return dp[word1.size()][word2.size()];
}
};