leetcode

来源:互联网 发布:怎么样利用网络挣钱 编辑:程序博客网 时间:2024/06/12 00:35

72. Edit Distance


Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)

You have the following 3 operations permitted on a word:

a) Insert a character
b) Delete a character
c) Replace a character

class Solution { public:    int minDistance(string word1, string word2) {         int m = word1.length(), n = word2.length();        vector<vector<int> > dp(m + 1, vector<int> (n + 1, 0));        for (int i = 1; i <= m; i++)            dp[i][0] = i;        for (int j = 1; j <= n; j++)            dp[0][j] = j;          for (int i = 1; i <= m; i++) {            for (int j = 1; j <= n; 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 - 1] + 1, min(dp[i][j - 1] + 1, dp[i - 1][j] + 1));            }        }        return dp[m][n];    }};

https://discuss.leetcode.com/topic/17639/20ms-detailed-explained-c-solutions-o-n-space jianchao.li.fighter 对动态规划解法分析的非常全面,有思路没思路都值得一看。


583. Delete Operation for Two Strings


Given two words word1 and word2, find the minimum number of steps required to make word1 and word2 the same, where in each step you can delete one character in either string.

Example 1:
Input: “sea”, “eat”
Output: 2
Explanation: You need one step to make “sea” to “ea” and another step to make “eat” to “ea”.
Note:
The length of given words won’t exceed 500.
Characters in given words can only be lower-case letters.

class Solution {public:    int minDistance(string word1, string word2) {         int m = word1.length(), n = word2.length();        vector<vector<int> > dp(m + 1, vector<int> (n + 1, 0));        for (int i = 1; i <= m; i++)            dp[i][0] = i;        for (int j = 1; j <= n; j++)            dp[0][j] = j;          for (int i = 1; i <= m; i++) {            for (int j = 1; j <= n; j++) {                if (word1[i - 1] == word2[j - 1])                     dp[i][j] = dp[i - 1][j - 1];                else dp[i][j] = min(dp[i][j - 1] + 1, dp[i - 1][j] + 1);            }        }        return dp[m][n];    }};

具体分析摘自:jianchao.li.fighter
This is a classic problem of Dynamic Programming. We define the state dp[i][j] to be the minimum number of operations to convert word1[0..i - 1] to word2[0..j - 1]. The state equations have two cases: the boundary case and the general case. Note that in the above notations, both i and j take values starting from 1.

For the boundary case, that is, to convert a string to an empty string, it is easy to see that the mininum number of operations to convert word1[0..i - 1] to “” requires at least i operations (deletions). In fact, the boundary case is simply:

dp[i][0] = i;
dp[0][j] = j.
Now let’s move on to the general case, that is, convert a non-empty word1[0..i - 1] to another non-empty word2[0..j - 1]. Well, let’s try to break this problem down into smaller problems (sub-problems). Suppose we have already known how to convert word1[0..i - 2] to word2[0..j - 2], which is dp[i - 1][j - 1]. Now let’s consider word[i - 1] and word2[j - 1]. If they are euqal, then no more operation is needed and dp[i][j] = dp[i - 1][j - 1]. Well, what if they are not equal?

If they are not equal, we need to consider three cases:

Replace word1[i - 1] by word2[j - 1] (dp[i][j] = dp[i - 1][j - 1] + 1 (for replacement));
Delete word1[i - 1] and word1[0..i - 2] = word2[0..j - 1] (dp[i][j] = dp[i - 1][j] + 1 (for deletion));
Insert word2[j - 1] to word1[0..i - 1] and word1[0..i - 1] + word2[j - 1] = word2[0..j - 1] (dp[i][j] = dp[i][j - 1] + 1 (for insertion)).
Make sure you understand the subtle differences between the equations for deletion and insertion. For deletion, we are actually converting word1[0..i - 2] to word2[0..j - 1], which costs dp[i - 1][j], and then deleting the word1[i - 1], which costs 1. The case is similar for insertion.

Putting these together, we now have:

dp[i][0] = i;
dp[0][j] = j;
dp[i][j] = dp[i - 1][j - 1], if word1[i - 1] = word2[j - 1];
dp[i][j] = min(dp[i - 1][j - 1] + 1, dp[i - 1][j] + 1, dp[i][j - 1] + 1), otherwise.

72题目中 有三种操作,替换 删除 插入;583题目中 仅有一种操作,即删除;
对于72中来说,删除和插入是可以实现等价;因此两道题目区别仅是 583不可以用替换俩实现字符串的匹配相等操作。因此在583状态转换的过程里少考虑替换这种操作 即可;
这种操作对应 dp[i][j] = dp[i - 1][j - 1] + 1; (for replacement)

原创粉丝点击