【代码随想录】刷题笔记Day53

news2024/9/29 11:42:50

前言

  • 不用开组会的我是多么阳光开朗,这周就要离开杭州回家啦,多刷题刷题

115. 不同的子序列 - 力扣(LeetCode)

  • dp[i][j]
    • 以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]
  • 递推公式
    • dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
  •  初始化
    • dp[i][0] = 1,dp[0][j] = 0,dp[0][0] = 1,遍历从上到下,从左到右
  • 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. 两个字符串的删除操作 - 力扣(LeetCode)

  • 思路一

    • 求最长公共子序列,再求每个串相减所需要的步数,相加
    • class Solution {
      public:
          int minDistance(string word1, string word2) {
              // 求最长公共子序列(不连续)
              int len1 = word1.size();
              int len2 = word2.size();
              int maxlen = 0;
              vector<vector<int>> dp (len1 + 1, vector<int>(len2 + 1, 0));
              for (int i = 1; i <= len1; i++) {
                  for (int j = 1; j <= len2; j++) {
                      if(word1[i - 1] == word2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
                      else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
                      maxlen = max(dp[i][j], maxlen);
                  }
              }
              // 求每个串减去公共子序列需要的步数,相加
              return len1 + len2 - 2 * maxlen;
          }
      };
  • 思路二

    •  编辑子串思路,两个字符串都可以进行删除操作
    • dp[i][j]含义
      • 以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,达到相等所需要删除元素的最少次数
    • 递推公式
      • 当word1[i - 1] 与 word2[j - 1]相同的时候,dp[i][j] = dp[i - 1][j - 1];
      • 当word1[i - 1] 与 word2[j - 1]不相同的时候
        • 情况一:删word1[i - 1],最少操作次数为dp[i - 1][j] + 1
        • 情况二:删word2[j - 1],最少操作次数为dp[i][j - 1] + 1
        • 情况三:同时删word1[i - 1]和word2[j - 1],操作的最少次数为dp[i - 1][j - 1] + 2
        • dp[i][j] = min({dp[i - 1][j - 1] + 2, dp[i - 1][j] + 1, dp[i][j - 1] + 1});
        • 可简化为dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);
    • 初始化
      • 空字符串要全删,dp[i][0] = i,dp[0][j] = j,从上到下从左到右
    • class Solution {
      public:
          int minDistance(string word1, string word2) {
              int len1 = word1.size();
              int len2 = word2.size();
              vector<vector<int>> dp(len1 + 1, vector<int>(len2 + 1));
              for(int i = 0; i <= len1; i++) dp[i][0] = i;
              for(int j = 0; j <= len2; j++) dp[0][j] = j;
              for(int i = 1; i <= len1; i++){
                  for(int j = 1; j <= len2; 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[len1][len2];
          }
      };

 72. 编辑距离 - 力扣(LeetCode)

  • 终极经典题目,暴力都没思路,1→2增删改,实际上是1→3←2删改
  • dp[i][j]含义
    • 以下标i-1为结尾的字符串word1,和以下标j-1为结尾的字符串word2,最近编辑距离(最小编辑次数)为dp[i][j]
  • 递推公式
    • if(word1[i-1] == word2[j-1]){
          // 不操作
          dp[i][j] = dp[i-1][j-1];
      }else{
          // 增/删:dp[i-1][j] + 1, dp[i][j-1] + 1
          // 改:dp[i-1][j-1] + 1
          dp[i][j] = min(min(dp[i-1][j] + 1, dp[i][j-1] + 1), dp[i-1][j-1] + 1);
      }
  • 初始化
    •  空字符串要全删,dp[i][0] = i,dp[0][j] = j,从上到下从左到右
  • class Solution {
    public:
        int minDistance(string word1, string word2) {
            int len1 = word1.size();
            int len2 = word2.size();
            vector<vector<int>> dp(len1 + 1, vector<int>(len2 + 1));
            for(int i = 0; i <= len1; i++) dp[i][0] = i;
            for(int j = 0; j <= len2; j++) dp[0][j] = j;
            for(int i = 1; i <= len1; i++){
                for(int j = 1; j <= len2; j++){
                    if(word1[i-1] == word2[j-1]){
                        dp[i][j] = dp[i-1][j-1];
                    }else{
                        dp[i][j] = min(min(dp[i-1][j] + 1, dp[i][j-1] + 1), dp[i-1][j-1] + 1);
                    }
                }
            }
            return dp[len1][len2];
        }
    };

后言

  • 下篇就是动规dp最后一篇啦,今天一次性搞完,心情鸡冻~ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1410315.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端动画特效分享(附效果图及在线演示)

分享7款有趣也实用的前端动画特效 其中有CSS动画、canvas动画、js小游戏等等 下方效果图可能不是特别的生动 那么你可以点击在线预览进行查看相应的动画特效 同时也是可以下载该资源的 SVG天气图标动画特效 SVG天气图标动画特效 不管是晴天雨天等都很完美的展示出了各自真实的…

Linux——shell程序的简单实现

shell程序的简单实现 本章思维导图&#xff1a; 注&#xff1a;本章思维导图对应的.xmind和.png文件都已同步导入至资源&#xff0c;可免费查阅 在学习完有关进程的知识后&#xff0c;我们就可以开始尝试自己实现一个简单的shell程序了。 注&#xff1a;在编写简单的shell程…

R语言-检验正态性

1.为什么要检验正态性 首先需要明确正态性与正态分布是有区别的&#xff0c;正态分布&#xff08;标准分布&#xff09;是统计数据的分布方式&#xff0c;是个钟形曲线&#xff0c;已平均值为对称轴&#xff0c;数据在对称轴两侧对称分布。正态性是检验实际数据与标准正态分布…

基于Java SSM框架实现在线考试系统项目【项目源码+论文说明】

基于java的SSM框架实现在线考试系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#…

字符金字塔(C语言刷题)

个人博客主页&#xff1a;https://blog.csdn.net/2301_79293429?typeblog 专栏&#xff1a;https://blog.csdn.net/2301_79293429/category_12545690.html 题目描述 请打印输出一个字符金字塔&#xff0c;字符金字塔的特征请参考样例 输入描述: 输入一个字母&#xff0c;保…

06.搭建一个自己的私有仓库-Gitea

06.搭建一个自己的私有仓库-Gitea | DLLCNX的博客 如果你是一位程序员或者IT相关领域的从业者&#xff0c;那么肯定知道git&#xff0c;而且也或多或少接触了不少开源仓库以及公司的私有仓库&#xff0c;但是我们有没有想过自己也搭建一个私有仓库呢。 这么多开源仓库&#xf…

C++练习题1-9

文章目录 NO1、选出妃子、宫女和嬷嬷No2、根据数字判断月份No3、循环计数No4、循环选数No5、玩转字符No6、计算字符串长度No7、显示字符串中的字符No8、字符串反转No9、二维数组的应用 NO1、选出妃子、宫女和嬷嬷 其他要求&#xff1a; 超女用结构体表示不要嵌套if输入所有数据…

【数据结构】72变的双端队列

双端队列 前言一、双端队列1.1 双端队列的定义1.2 输入受限的双端队列1.3 输出受限的双端队列1.5 输入输出都受限的双端队列1.6 小结 二、双端队列的使用2.1 双端队列的出队序列——暴力求解2.1.1 栈的出栈序列2.1.2 输入受限的双端队列2.1.3 输出受限的双端队列2.1.4 输入输出…

JCL中常用的DD语句

JCL中的DD语句介绍 ​ DD语句&#xff0c;主要定义数据集用的&#xff0c;也叫做DATASET DEFINE&#xff0c;分为定义设备的UNIT、VOLUME、SPACE&#xff0c;定义数据集的DSN、DISP、DCB,详细可以看英文版的《MVS JCL Reference》&#xff0c;还有一些特殊的DD&#xff0c;暂时…

一文掌握!九大提升 ECS 实例操作系统安全性技巧

云布道师 引言&#xff1a;【弹性计算技术公开课——ECS 安全季】第二节课程由阿里云弹性计算技术专家陈怀可带来&#xff0c;本文内容整理自他的课程&#xff0c;供各位阅览。 安全事件案例回顾与操作系统安全概念介绍 在介绍操作系统安全概念前&#xff0c;我们先来看一下…

每次打开都是:已在调试程序中暂停的处理

点击F12&#xff0c;把这个勾选去掉就可以了。

网安培训第二期——sql注入+中间件+工具

文章目录 宽字节注入插入注入二次注入PDO模式(动态靶机&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;)sql注入读取文件sql注入导出文件linux命令 10.12笔记sqlmapsqlmap参数 10.13笔记sqlmap 文件读写前后缀常用tamper及适用场景 10.…

操作系统-线程的概念(什么是线程 为什么线程共享进程资源 为什么线程切换开销低 引入线程的变化 线程属性 为啥要引入线程)

文章目录 总览什么是线程&#xff0c;为什么要引入线程引入线程机制的变化线程的属性 总览 什么是线程&#xff0c;为什么要引入线程 此时qq进程内的视频文字聊天传输文件可以同时进行&#xff0c;如果进程内部是顺序执行的话&#xff0c;那么将某一时刻只能执行一个功能&…

C语言王道练习题第七周两题

第一题 Description 输入一个学生的学号&#xff0c;姓名&#xff0c;性别&#xff0c;用结构体存储&#xff0c;通过 scanf 读取后&#xff0c;然后再 通过 printf 打印输出 Input 学号&#xff0c;姓名&#xff0c;性别&#xff0c;例如输入 101 xiongda m Output 输出…

基于YOLOv8与ByteTrack的车辆行人多目标检测与追踪系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标追踪、运动物体追踪

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

开源项目Git Commit规范与ChangeLog

一&#xff0c;conventional commit(约定式提交) Conventional Commits 是一种用于给提交信息增加人机可读含义的规范。它提供了一组用于创建清晰的提交历史的简单规则。 1.1 作用 自动化生成 CHANGELOG基于提交类型&#xff0c;自动决定语义化的版本变更向项目相关合作开发…

数学与计算机:一场幽默风趣的盲约

数学与计算机&#xff1a;一场幽默风趣的盲约 Mathematics and Computers: A Humorous and Witty Blind Date 大家好&#xff0c;今天我们将要探讨一个比猫和键盘之间的深刻关系更有趣的话题——数学和计算机的浪漫邂逅。这可不是一场普通的相亲&#xff0c;而是一场逻辑与算法…

Vue+OpenLayers7入门到实战:快速搭建Vue+OpenLayers7地图脚手架项目。从零开始构建Vue项目并整合OpenLayers7.5.2

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7 前言 本章针对Vue初学者,对Vue不熟悉,甚至还不会Vue的入门学生读者。 本章会详细讲解从NodeJS环境到npm环境的各个步骤,再到使用vue-cli脚手架快速生成项目,以及添加OpenLayers7地图库依赖,编写简单的xyz高德地图显示…

基于python豆瓣电影评论的情感分析和聚类分析,聚类分析有手肘法进行检验,情感分析用snownlp

基于Python的豆瓣电影评论的情感分析和聚类分析是一种用于探索电影评论数据的方法。 情感分析 情感分析旨在从文本中提取情感信息&#xff0c;并对其进行分类&#xff0c;如正面、负面或中性。在这里&#xff0c;我们使用了一个名为snownlp的Python库来进行情感分析。Snownlp是…

Excel:将截面数据转换成面板数据

原始截面数据如下&#xff1a; 步骤&#xff1a;数据——自表格/区域 点击确定&#xff0c;出现下图&#xff1a; 然后&#xff0c;在这个界面选择&#xff1a;“转换”——“逆透视列”下选择逆透视其他列。会出现面板数据形式。 然后&#xff0c;点击“主页”——关闭并上载即…