题目:
Given two strings word1
and word2
, return the minimum number of steps required to make word1
and word2
the same.
In one step, you can delete exactly one character in either string.
Example 1:
Input: word1 = "sea", word2 = "eat" Output: 2 Explanation: You need one step to make "sea" to "ea" and another step to make "eat" to "ea".
Example 2:
Input: word1 = "leetcode", word2 = "etco" Output: 4
Constraints:
1 <= word1.length, word2.length <= 500
word1
andword2
consist of only lowercase English letters.
思路:
dp题,dp[i][j]表示使字符串s1 [0, i - 1]截取的字符串和s2 [0, j - 1]截取的字符串相等的情况,需要进行多少次删除。dp公式比较简单,如果当前两个字母相等的话,那就不用删除了,直接dp[i][j] = dp[i - 1][j - 1]即可;如果不相同,分为三种情况,一是dp[i][j]来自删除s1的一个字母,即dp[i - 1][j] + 1,二使来自删除s2的一个字母,即dp[i][j - 1] + 1,最后是两个字符串都删除一个字母,即dp[i - 1][j - 1] + 2。初始化从dp定义出发,对于f[i][0]来说,即s1的子串[0, i]删除几次才能和空字符串相同,显然是i次,对于f[0][j]同理。
代码:
class Solution {
public:
int minDistance(string s1, string s2) {
int m = s1.size(), n = s2.size();
vector<vector<int>> f(m + 1, vector<int>(n + 1));
for (int i = 1; i < m + 1; i++) {
f[i][0] = i;
}
for (int j = 1; j < n + 1; j++) {
f[0][j] = j;
}
for (int i = 1; i < m + 1; i++) {
for (int j = 1; j < n + 1; j++) {
if (s1[i - 1] == s2[j - 1]) {
f[i][j] = f[i - 1][j - 1];
}
else {
f[i][j] = min({ f[i - 1][j] + 1, f[i][j - 1] + 1, f[i - 1][j - 1] + 2 });
}
}
}
return f[m][n];
}
};