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

代码随想录第五十九天 | 115.不同的子序列,583. 两个字符串的删除操作, 72. 编辑距离

115.不同的子序列

看完想法:这个题目只涉及删减,具体是 s 字符串的删减,t 不需要动。当s[ i ] == t[j]时,有两种情况,可以用s[i]也可以不用,而s[i] !=t[j]时只有一种情况,需要删除s[i]进一步比较。在初始化时,不要臆想,要根据dp [i][j]定义初始化。dp[i][0] 表示:以i-1为结尾的s可以随便删除元素,出现空字符串的个数,肯定为1;dp[0][j]一定都是0,s如论如何也变成不了t;dp[0][0]应该是1,空字符串s,可以删除0个元素,变成空字符串t。

int numDistinct(string s, string t) {//uint64_t代表unsigned long int,有8个字节,直接用int会溢出vector<vector<uint64_t>> dp(s.size() + 1, vector<uint64_t>(t.size() + 1));//dp数组初始化for (int i = 0; i < s.size(); i++) dp[i][0] = 1;for (int j = 1; j < t.size(); j++) dp[0][j] = 0;//dp递推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. 两个字符串的删除操作

看完想法:这里删除操作需要取最小值,如果s[i] == t[j],不用作操作,继承上次dp;如果不太相同就需要删除,包含3种情况,删除s / 删除t / 两个都删。

int minDistance(string word1, string word2) {//dp初始化vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));//此处以要注意,下标为i-1的字符串变成0,需要i次操作for(int i = 0; i<= word1.size();i++) dp[i][0] = i;for (int j = 0; j <= word2.size(); j++) dp[0][j] = j;//dp迭代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. 编辑距离

看完想法:在进行dp迭代时,删除元素和添加元素可以公用一个式子,因为删除word1和添加word2时等价的,操作数都一样;替换元素也只有一次操作数dp[i][j] = dp[i - 1][j - 1] + 1。综上,dp[i][j]取3个式子中的最小值。

int minDistance(string word1, string word2) {vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));//初始化,和之前的题目大同小异,结尾为i-1的word1如何变成0for(int i = 0; i<= word1.size(); i++) dp[i][0] = i;for(int i = 0; i<= word2.size(); i++) dp[0][i] = i;//dp迭代,注意0已经初始化,要从i, j =1开始for(int i =1; i<=word1.size() ;i++){for(int j = 1; j<=word2.size(); j++){//这需要分当前遍历的word1和word2元素相等/不相等//相等不做操作,不相等要增删减if(word1[i-1] == word2[j-1]) dp[i][j] = dp[i-1][j-1];else{//min操作(中间还需要一个{}),针对3个及以上的元素dp[i][j] = min({dp[i-1][j] , dp[i][j-1] , dp[i-1][j-1]}) + 1;}}}return dp[word1.size()][word2.size()];

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 自学Java第11Day
  • LLM推理优化
  • 深度学习 —— 个人学习笔记6(权重衰减)
  • 价格战再起:OpenAI 发布更便宜、更智能的 GPT-4o Mini 模型|TodayAI
  • 前端设计模式面试题汇总
  • c++ primer plus 第16章string 类和标准模板库, 泛型编程----为何使用迭代器
  • 面试题 33. 二叉搜索树的后序遍历序列
  • GD32 MCU上电跌落导致启动异常如何解决
  • 《简历宝典》18 - 简历中“技术能力”,如何丰满且有层次,Java篇
  • MySQL简介以及对数据库的操作
  • 力扣 102题 二叉树的层次遍历 记录
  • CSS 中border-radius 属性
  • 学习并测试SqlSugar的单库事务功能
  • k8s二次开发-kubebuiler一键式生成deployment,svc,ingress
  • Lamp 小白菜鸟从入门到精通
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • CentOS 7 防火墙操作
  • CSS 提示工具(Tooltip)
  • exports和module.exports
  • JSDuck 与 AngularJS 融合技巧
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Spring Cloud中负载均衡器概览
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 使用SAX解析XML
  • 数组的操作
  • 微信开放平台全网发布【失败】的几点排查方法
  • 移动端唤起键盘时取消position:fixed定位
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • MPAndroidChart 教程:Y轴 YAxis
  • ​Spring Boot 分片上传文件
  • # 数据结构
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (02)Unity使用在线AI大模型(调用Python)
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (2)(2.10) LTM telemetry
  • (39)STM32——FLASH闪存
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (分类)KNN算法- 参数调优
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (译)2019年前端性能优化清单 — 下篇
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .net core 6 redis操作类
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • @ResponseBody
  • [<事务专题>]
  • [20160902]rm -rf的惨案.txt
  • [Android 数据通信] android cmwap接入点