【代码随想录】50

4

023年11月2日 - 动态规划16

583. 两个字符串的删除操作

dp[i][j] 表示的是 以i - 1为结尾的word1和以 j - 1为结尾的word2 为了让这两个字符串相同的最小操作次数

 class Solution {
 public:
     int minDistance(string word1, string word2) {
         vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1));
         for (int i = 0; i <= word1.size(); i++) dp[i][0] = i;
         for (int j = 0; 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];    //考不考虑i和j都一样
                 } else {
                     dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);
                 }
             }
         }
         return dp[word1.size()][word2.size()];
     }
 };

72. 编辑距离

dp[i][j] 以i - 1为为结尾的word1和以j - 1为结尾的word2 相同的最小操作次数

 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 = 0; 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 - 1], dp[i - 1][j], dp[i][j - 1]}) + 1;
                 }
             }
         }
         return dp[word1.size()][word2.size()];
     }
 };