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

*算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离

刷题记录

  • *115. 不同的子序列
  • *583. 两个字符串的删除操作
    • 解法一
    • 解法二
  • *72. 编辑距离

*115. 不同的子序列

leetcode题目地址

dp[i][j]代表:以i-1结尾的s中包含以j-1结尾的t的个数。

有以下两种情况:

  • s[i-1] == t[i-1]:
    • 考虑s[i-1]
    • 不考虑s[i-1]
  • s[i-1] != t[i-1]

题解思路

时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( n ∗ m ) O(n*m) O(nm)

// c++
class Solution {
public:int numDistinct(string s, string t) {vector<vector<unsigned int>> dp(s.size()+1, vector<unsigned int>(t.size()+1, 0));dp[0][0] = 1;for(int i=1; i<=s.size(); i++){dp[i][0] = 1;}for(int i=1; i<=t.size(); i++){dp[0][i] = 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题目地址

解法一

dp[i][j]存储i-1结尾的word1与以j-1结尾的word2最少删除操作的次数。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

// c++
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][j-1]+1, dp[i-1][j-1]+2});}}}return dp[word1.size()][word2.size()];}
};

解法二

dp[i][j]存储i-1结尾的word1与以j-1结尾的word2最长公 共子序列。最后用word1.size()+word2.size()减去最长公共子序列。

// c++
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=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] + 1;else dp[i][j] = max(dp[i][j-1], dp[i-1][j]);}}return word1.size()+word2.size()-dp[word1.size()][word2.size()]*2;}
};

*72. 编辑距离

leetcode题目地址

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增、word2增、word1&word2都增)和删除等效
    • 删:(word1删:dp[i-1][j]+1、word2删:dp[i][j-1]+1、word1&word2都删:dp[i-1][j-1]+2)
    • 改:(仅需修改一次)dp[i-1][j-1] + 1

时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( n 2 ) O(n^2) O(n2)

// c++
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], dp[i][j-1], dp[i-1][j-1]})+1;}}/*// 输出dpfor(int j=1; j<=word2.size(); j++) cout<<dp[i][j]<<" ";cout<<endl;*/}return dp[word1.size()][word2.size()];}
};

相关文章:

  • Linux:账号和权限管理(一)
  • css 数字平铺布局
  • uni-app关于跨域问题(十七)
  • Go语言使用cobra开发第一个命令行程序
  • 【redis】springboot 用redis stream实现MQ消息队列 考虑异常ack重试场景
  • The C programming language (second edition,KR) exercise(CHAPTER 7)
  • 苹果手机清理软件:让你的iPhone保持最佳状态
  • JavaScript前端面试题——fetch
  • 上海冷链配送新篇章 华鼎冷链科技以卓越服务餐饮品牌
  • 技术汇总笔记7:switch 嵌套用法 和 改进 (条件分支相关内容)
  • Excel文件处理excel内容
  • FastAPI技巧
  • HTML-03.新浪新闻-标题-样式2
  • Arco Design 之Table表格
  • 【医学影像】无痛安装mamba
  • [Vue CLI 3] 配置解析之 css.extract
  • 2017届校招提前批面试回顾
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • HTTP那些事
  • Java深入 - 深入理解Java集合
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • LeetCode18.四数之和 JavaScript
  • Markdown 语法简单说明
  • Python学习笔记 字符串拼接
  • Spring Boot快速入门(一):Hello Spring Boot
  • vue 配置sass、scss全局变量
  • yii2中session跨域名的问题
  • 分布式熔断降级平台aegis
  • 技术:超级实用的电脑小技巧
  • 深度学习中的信息论知识详解
  • 使用 QuickBI 搭建酷炫可视化分析
  • 微服务框架lagom
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 阿里云ACE认证之理解CDN技术
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • #NOIP 2014#Day.2 T3 解方程
  • (007)XHTML文档之标题——h1~h6
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (27)4.8 习题课
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (差分)胡桃爱原石
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)
  • (转)创业家杂志:UCWEB天使第一步
  • ./configure、make、make install 命令
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET 分布式技术比较
  • .net 提取注释生成API文档 帮助文档
  • .NET技术成长路线架构图
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • /var/lib/dpkg/lock 锁定问题