当前位置: 首页 > news >正文

【c++刷题笔记-动态规划】day45: 115.不同的子序列 、583. 两个字符串的删除操作 、 72. 编辑距离

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

思路:用s与t比较相等就判断dp[i-1][j-1]+dp[i-1][j]两个方向的值,不相同就判断dp[i-1][j]方向

重点:if(s[i-1]==t[j-1]){
                    dp[i][j]=(dp[i-1][j-1]+dp[i-1][j])%mod;
                }else{
                    dp[i][j]=dp[i-1][j]%mod;
             }

class Solution {
public:const int mod=1e9+7;int numDistinct(string s, string t) {int n=s.size(),m=t.size();vector<vector<long>>dp(n+1,vector<long>(m+1,0));for(int i=0;i<n;i++){dp[i][0]=1;//当t为零时为s的一个子序列}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(s[i-1]==t[j-1]){//用s比较因为s可能有重复的字符,所以从dp[i-1][j-1]+dp[i-1][j]两个方向推导dp[i][j]=(dp[i-1][j-1]+dp[i-1][j])%mod;}else{//相当于在s中删除字符dp[i][j]=dp[i-1][j]%mod;}}}return dp[n][m];}
};

 583. 两个字符串的删除操作 - 力扣(LeetCode)

思路:相同就延续之前的状态,不想同每次删除word1和word2都需要一次操作。

class Solution {
public:int minDistance(string word1, string word2) {int n=word1.size(),m=word2.size(),ans=INT_MIN;vector<vector<int>>dp(n+1,vector<int>(m+1,0));for(int i=0;i<=n;i++){dp[i][0]=i;//word2为0,每个字符需要修改i次}for(int j=0;j<=m;j++){dp[0][j]=j;//word1为0,每个字符需要修改j次}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(word1[i-1]==word2[j-1]){dp[i][j]=dp[i-1][j-1];///相同不需要修改}else{dp[i][j]=min(dp[i][j-1]+1,dp[i-1][j]+1);//删除一个字符然后次数加一}}}return dp[n][m];}
};

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

思路:相同就延续之前的状态,不想同每次删除word1和word2都需要一次操作。删除操作隐含了同时删除两个dp[i-1][j-1]+2。增加和删除操作数是一样的。替换操作就是在原来的基础是加一就相同了

class Solution {
public:int minDistance(string word1, string word2) {int m=word1.size(),n=word2.size();vector<vector<int>>dp(m+1,vector<int>(n+1));for(int i=0;i<=m;i++){dp[i][0]=i;//word2为0,每个字符需要修改i次}for(int j=0;j<=n;j++){dp[0][j]=j;//word1为0,每个字符需要修改j次}for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(word1[i-1]==word2[j-1]){//相同不修改dp[i][j]=dp[i-1][j-1];}else{//删除和增加操作数是一样的,替换操作是dp[i-1][j-1]+1dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1;}}}return dp[m][n];}
};

总结

编辑距离问题,初始化每个字符修改的次数。然后统计删除操作的个数

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Chat-REC——基于 LLM 的推荐系统算法解析
  • Android SurfaceFlinger——创建EGLContext(二十六)
  • Docker部署Elasticsearch8.6.0 Kibana8.6.0
  • rabbitmq生产与消费
  • HTTPServer改进思路1
  • 怎样在 PostgreSQL 中实现数据的异地备份?
  • 微信小程序-CANVAS写入图片素材、文字等数据生成图片
  • MySql性能调优05-[sql实战演练]
  • 简单工厂、工厂方法与抽象工厂之间的区别
  • 云计算遭遇的主要安全威胁
  • el-tree动态添加子节点的问题
  • 加拿大上市药品查询-加拿大药品数据库
  • 2.3 大模型硬件基础:AI芯片(上篇) —— 《带你自学大语言模型》系列
  • I can‘t link the chatbot model with react
  • Scrcpy adb server version (41) doesn‘t match this client (39); killing...
  • 【刷算法】从上往下打印二叉树
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • ➹使用webpack配置多页面应用(MPA)
  • android 一些 utils
  • CODING 缺陷管理功能正式开始公测
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • CSS相对定位
  • DOM的那些事
  • in typeof instanceof ===这些运算符有什么作用
  • Java IO学习笔记一
  • magento2项目上线注意事项
  • PhantomJS 安装
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Yeoman_Bower_Grunt
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 技术胖1-4季视频复习— (看视频笔记)
  • 力扣(LeetCode)21
  • 如何学习JavaEE,项目又该如何做?
  • 深度解析利用ES6进行Promise封装总结
  • 消息队列系列二(IOT中消息队列的应用)
  • 写代码的正确姿势
  • 学习使用ExpressJS 4.0中的新Router
  • 硬币翻转问题,区间操作
  • ​2020 年大前端技术趋势解读
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​插件化DPI在商用WIFI中的价值
  • #QT(TCP网络编程-服务端)
  • #systemverilog# 之 event region 和 timeslot 仿真调度(十)高层次视角看仿真调度事件的发生
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (1)Hilt的基本概念和使用
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (vue)页面文件上传获取:action地址
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (七)c52学习之旅-中断
  • (五)网络优化与超参数选择--九五小庞
  • (一)RocketMQ初步认识