代码训练营 day50|LeetCode 115,LeetCode 583,LeetCode 72

时间:2024-11-05 21:16:04

前言

这里记录一下陈菜菜的刷题记录,主要应对25秋招、春招
个人背景
211CS本+CUHK计算机相关硕,一年车企软件开发经验
代码能力:有待提高
常用语言:C++

系列文章目录

第50天 :第九章 动态规划part12


`

文章目录

  • 前言
  • 系列文章目录
    • 第50天 :第九章 动态规划part12
  • 一、今日任务
  • 二、详细布置
      • 115.不同的子序列
        • 提示:
        • 样例1:
        • 思路
        • 实战
      • 583. 两个字符串的删除操作
        • 提示:
        • 样例1:
        • 思路
        • 实战
      • 72. 编辑距离
        • 提示:
        • 样例1:
        • 样例2:
        • 思路
        • 实战
    • 总结



一、今日任务

● 115.不同的子序列
● 583. 两个字符串的删除操作
● 72. 编辑距离

二、详细布置

115.不同的子序列

题目链接:力扣115
文章讲解:代码随想录

给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数,结果需要对 109 + 7 取模。

提示:

1 <= s.length, t.length <= 1000
s 和 t 由英文字母组成

样例1:
输入:s = "rabbbit", t = "rabbit"
输出:3
解释:
如下所示,3 种可以从 s 中得到 "rabbit" 的方案。
rabbbit
rabbbit
rabbbit
思路

这题很难,码一下,还没掌握。

实战
class Solution {
public:
    int numDistinct(string s, string t) {
        vector<vector<uint64_t>> dp(s.size() + 1, vector<uint64_t>(t.size() + 1));
        for (int i = 0; i < s.size(); i++) dp[i][0] = 1;
        for (int j = 1; j < t.size(); j++) dp[0][j] = 0;
        for (int i = 1; i <= s.size(); i++) {
            for (int j = 1; j <= t.size(); j++) {
                if (s[i - 1] == t[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
                } else {
                    dp[i][j] = dp[i - 1][j];
                }
            }
        }
        return dp[s.size()][t.size()];
    }
};

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

题目链接:力扣583题链接
文章讲解:图文讲解

给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。

每步 可以删除任意一个字符串中的一个字符。

提示:

1 <= word1.length, word2.length <= 500
word1 和 word2 只包含小写英文字母

样例1:
输入: word1 = "sea", word2 = "eat"
输出: 2
解释: 第一步将 "sea" 变为 "ea" ,第二步将 "eat "变为 "ea"     
思路

这题也好难啊,比上一题更复杂,原本准备找出两个字符串最大子串的,但是这个最大子串的删除方式也不一定就是最少的。码一下

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

72. 编辑距离

题目链接:LeetCode72
文章讲解:图文讲解

题目描述

给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。

你可以对一个单词进行如下三种操作:

插入一个字符
删除一个字符
替换一个字符

提示:

0 <= word1.length, word2.length <= 500
word1 和 word2 由小写英文字母组成

样例1:
输入:word1 = "horse", word2 = "ros"
输出:3
解释:
horse -> rorse ('h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')
样例2:
输入:word1 = "intention", word2 = "execution"
输出:5
解释:
intention -> inention (删除 't')
inention -> enention ('i' 替换为 'e')
enention -> exention ('n' 替换为 'x')
exention -> exection ('n' 替换为 'c')
exection -> execution (插入 'u')
思路

这题是真难。看了题解觉得不难,码一下,二刷。

实战
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()];
    }
};

总结

今天主要学习了编辑距离的一系列操作,今天的题目都好难啊。
加油,坚持打卡的第50天。