代码随想录第五十九天 | 115.差别的子序列,583. 两个字符串的删除利用, 72. 编辑间隔 [复制链接]
发表于 2026-4-24 09:30:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
115.差别的子序列

看完想法:这个标题只涉及删减,具体是 s 字符串的删减,t 不须要动。当s[ i ] == t[j]时,有两种环境,可以用s也可以不消,而s !=t[j]时只有一种环境,须要删除s进一步比力。在初始化时,不要臆想,要根据dp [j]界说初始化。dp[0] 体现:以i-1为末端的s可以任意删除元素,出现空字符串的个数,肯定为1;dp[0][j]肯定都是0,s如论怎样也变成不了t;dp[0][0]应该是1,空字符串s,可以删除0个元素,变成空字符串t。
  1. int numDistinct(string s, string t) {
  2.         //uint64_t代表unsigned long int,有8个字节,直接用int会溢出
  3.         vector<vector<uint64_t>> dp(s.size() + 1, vector<uint64_t>(t.size() + 1));
  4.         //dp数组初始化
  5.         for (int i = 0; i < s.size(); i++) dp[i][0] = 1;
  6.         for (int j = 1; j < t.size(); j++) dp[0][j] = 0;
  7.         //dp递推
  8.         for (int i = 1; i <= s.size(); i++) {
  9.             for (int j = 1; j <= t.size(); j++) {
  10.                 if (s[i - 1] == t[j - 1]) {
  11.                     dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
  12.                 } else {
  13.                     dp[i][j] = dp[i - 1][j];
  14.                 }
  15.             }
  16.         }
  17.         return dp[s.size()][t.size()];
  18.     }
复制代码
583. 两个字符串的删除利用

看完想法:这里删除利用须要取最小值,假如s == t[j],不消作利用,继承前次dp;假如不太雷同就须要删除,包罗3种环境,删除s / 删除t / 两个都删。
  1. int minDistance(string word1, string word2) {
  2.         //dp初始化
  3.         vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));
  4.         //此处以要注意,下标为i-1的字符串变成0,需要i次操作
  5.         for(int i = 0; i<= word1.size();i++) dp[i][0] = i;
  6.         for (int j = 0; j <= word2.size(); j++) dp[0][j] = j;
  7.         //dp迭代
  8.         for (int i = 1; i <= word1.size(); i++) {
  9.             for (int j = 1; j <= word2.size(); j++) {
  10.                 if (word1[i - 1] == word2[j - 1]) {
  11.                     dp[i][j] = dp[i - 1][j - 1];
  12.                 } else {
  13.                     dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);
  14.                 }
  15.             }
  16.         }
  17.         return dp[word1.size()][word2.size()];
复制代码
 72. 编辑间隔

看完想法:在举行dp迭代时,删除元素和添加元素可以公用一个式子,由于删除word1和添加word2时等价的,利用数都一样;更换元素也只有一次利用数dp[j] = dp[i - 1][j - 1] + 1。综上,dp[j]取3个式子中的最小值。
  1. int minDistance(string word1, string word2) {
  2.         vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));
  3.         //初始化,和之前的题目大同小异,结尾为i-1的word1如何变成0
  4.         for(int i = 0; i<= word1.size(); i++) dp[i][0] = i;
  5.         for(int i = 0; i<= word2.size(); i++) dp[0][i] = i;
  6.         //dp迭代,注意0已经初始化,要从i, j =1开始
  7.         for(int i =1; i<=word1.size() ;i++){
  8.             for(int j = 1; j<=word2.size(); j++){
  9.                 //这需要分当前遍历的word1和word2元素相等/不相等
  10.                 //相等不做操作,不相等要增删减
  11.                 if(word1[i-1] == word2[j-1]) dp[i][j] = dp[i-1][j-1];
  12.                 else{
  13.                 //min操作(中间还需要一个{}),针对3个及以上的元素
  14.                 dp[i][j] = min({dp[i-1][j] , dp[i][j-1] , dp[i-1][j-1]}) + 1;
  15.                 }
  16.             }
  17.         }
  18.         return dp[word1.size()][word2.size()];
复制代码

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表