代码随想录算法训练营第四十三天| 583. 两个字符串的删除操作 72. 编辑距离

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

要求:

删除最少的步数,来让这两个字符串相等

思路:

求末尾的最长公共子序列的长度,然后减去他们的长度

思路2:

相等:

dp[i][j] = dp[i-1][j-1]

不相等:

dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1)

代码:

 1 // 要求:两个字符串,删除任意一个字符后,让这两个字符相等
 2 // dp[n][m] 以n-1结尾的字符串变成节点为m-1为子序列的最大个数
 3 // 
 4 // 求最大相同子序列长度
 5 // 和上一个的区别:不光s[i-1]忽略 t[j-1] 也可以忽略
 6 // 
 7 // dp[i][j] 
 8 //   相等 dp[i-1][j-1]+1
 9 //   不相等 max(dp[i-1][j],dp[i][j-1])
10 //
11 int minDistance(string word1, string word2) {
12     vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));
13 
14 
15     for (int i = 1; i <= word1.size(); i++)
16     {
17         for (int j = 1; j <= word2.size(); j++)
18         {
19             if (word1[i - 1] == word2[j - 1])
20             {
21                 dp[i][j] = dp[i - 1][j - 1] + 1;
22             }
23             else
24             {
25                 dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
26             }
27         }
28     }
29 
30     int result = word1.size() - dp[word1.size()][word2.size()] + word2.size() - dp[word1.size()][word2.size()];
31 
32     return result;
33 }

 72. 编辑距离 

要求:

返回最少的增加,删除,替换的次数

增加,删除:dp[i-1][j]+1,dp[i][j-1]+1

替换:dp[i-1][j-1]+1

代码:

 1 // 要求:求最小 删除,替换,增加的次数
 2 // 思路
 3 // dp[n][m] 最小的操作次数
 4 // 一样:dp[n-1][m-1]
 5 // 删除,增加: dp[i-1][j]+1 dp[i][j-1]+1
 6 // 替换:dp[i][j]+1
 7 //
 8 int minDistance(string word1, string word2) {
 9     vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));
10 
11     for (int i = 0; i <= word1.size(); i++) dp[i][0] = i;
12     for (int j = 0; j <= word2.size(); j++) dp[0][j] = j;
13 
14     for (int i = 1; i <= word1.size(); i++)
15     {
16         for (int j = 1; j <= word2.size(); j++)
17         {
18             if (word1[i - 1] == word2[j - 1])
19             {
20                 dp[i][j] = dp[i - 1][j - 1];
21             }
22             else
23             {
24                 dp[i][j] = min(min(dp[i - 1][j] + 1, dp[i][j - 1] + 1), dp[i - 1][j - 1] + 1);
25             }
26         }
27     }
28 
29     return dp[word1.size()][word2.size()];
30 }

 

posted @ 2023-08-02 15:24  博二爷  阅读(6)  评论(0编辑  收藏  举报