day57 判断子序列 不同的子序列 两个字符串的删除操作 编辑距离

题目1  392 判读子序列

题目链接  392 判断子序列

题意

判断字符串s是否为字符串t的子序列  (子序列的相对位置在原字符串中不改变)

就是求最长公共子序列的长度与字符串s的长度是否相等

动态规划

1)确定dp数组及下标i的含义

dp[i][j] 表示以s[i-1]结尾的字符串与以t[j-1]结尾的字符串公共序列的最大长度

2)dp数组初始化

根据递推公式 dp[0][1] = 0   dp[1][0] = 0

3)递推公式

if(s[i-1] == t[j-1]) dp[i][j] = dp[i-1][j-1] +1;

else dp[i][j] = dp[i-1][j];  考虑1种情况  删除t字符串中该位置的元素(减1),该位置元素对应不等

4)遍历顺序

根据递推公式 从前向后遍历 从左向右遍历

for(int i =1; i <= s.size(); i++){

     for(int j = 1; j <= t.size(); j++){

     }

}

5)打印dp数组

代码

class Solution {
public:bool isSubsequence(string s, string t) {if(s.size() > t.size()) return false;int result = 0;//定义dp数组  初始化vector<vector<int>> dp(s.size() + 1, vector<int>(t.size() + 1, 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] + 1;else dp[i][j] = dp[i][j-1];result = max(result, dp[i][j]);}}if(result == s.size()) return true;return false;}
};
  • 时间复杂度:O(n × m)
  • 空间复杂度:O(n × m)

题目2 115 不同的子序列

题目链接 115 不同的子序列

题意

统计字符串s的子序列中字符串t出现的次数  即字符串s里面删除t能否变成字符串t

动态规划

1)确定dp数组及下标i的含义

dp[i][j]   以s[i-1]为结尾的字符串s中有t[j-1]为结尾的字符串t的个数

2)dp数组初始化

根据递推公式  dp[i][0]=1   字符串s中有1个空字符串

dp[0][i] = 0  空字符串s中有0个字符串t

dp[0][0]  空字符串s中有1个空字符串t

3)递推公式

若两个元素相等,那么就不考虑这个位置的元素  个数取决于:

1)前面已有的个数  dp[i-1][j-1]    2)字符串s中相邻两元素相同,模拟删除第一个(减1)  dp[i-1][j]

if(s[i-1] == t[i-1])   dp[i][j] = dp[i-1][j-1] + dp[i-1][j]

若不等,则模拟将元素从字符串s删除掉(减1)

else dp[i][j] = dp[i-1][j]     

4)遍历顺序

根据递推公式  从左向右遍历,从上到下遍历

for(int i = 1; i <= s.size(); i++){

   for(int j = 1; j <= t.size(); j++){

   }

}

5)打印dp数组

本题要求判断个数,所以要使用dp[s.size()][t.size()]求解最终的个数

如果再定义result与dp[i][j]比较了,会遇到这样的情况  s="eee"   t="eee"会得到错误的结果3

因为这里面的每个e都相同,在中间过程会重复计数,所以会产生错误

所以还是应该使用dp[s.size()][t.size()]表示以s.size()-1结尾的字符串s中有t.size()-1结尾的字符串t的个数,说明字符串s遍历到了末尾的位置,求解的是全部的个数

代码

class Solution {
public:int numDistinct(string s, string t) {if(s.size() < t.size()) return 0;//定义并初始化dp数组vector<vector<uint64_t>> dp(s.size() + 1, vector<uint64_t>(t.size() + 1, 0));//初始化dp数组for(int i = 0; i <= s.size(); i++){dp[i][0] = 1;}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];}// cout << "i=" << i << " " << "j=" << j << " " << dp[i][j] << endl; }}return dp[s.size()][t.size()];}
};
  • 时间复杂度: O(n * m)
  • 空间复杂度: O(n * m)

题目3  583 两个字符串的删除操作

题目链接 583 两个字符串的删除操作

题意

返回使得单词word1和word2相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。

动态规划

1)确定dp数组及下标i的含义

dp[i][j]  以word1[i-1]结尾的word1和以word2[j-1]结尾的word2相同的最小操作次数

2)dp数组初始化

根据递推公式 dp[0][j] = j        dp[i][0] = i

其它下标对应的dp[i][j]可初始化为任意值

3)递推公式

两个字符相同时,操作次数不受影响取决于前面的情况

if(word[i-1] == word2[j-1]) dp[i][j] = dp[i-1][j-1];

两个字符不相同时,那么就要删除一个字符(操作次数+1)  或是 删除两个字符(操作次数+2)

else dp[i][j] = min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+2)

4)遍历顺序

根据递推公式,从前向后遍历,从左向右遍历

for(int i = 1; i <= word1.size(); i++){

        for(int j = 1; j < word2.size(); j++){

        }

}

5)打印dp数组

代码

class Solution {
public:int minDistance(string word1, string word2) {//定义dp数组vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 2, 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] + 2, min(dp[i-1][j] + 1, dp[i][j-1] + 1));  }}return dp[word1.size()][word2.size()];}
};
  • 时间复杂度: O(n * m)
  • 空间复杂度: O(n * m)
法2:使用最长公共子序列进行求解

word1.size() + word2.size() - 2 * coseqlen;

动态规划

1)确定dp数组及下标i的含义

dp[i][j]  以word1[i-1]结尾的word1和以word2[j-1]结尾的word2最长公共子序列的长度

2)dp数组初始化

根据递推公式 dp[0][j] = 0       dp[i][0] = 0

其它下标对应的dp[i][j]可初始化为任意值

3)递推公式

两个字符相同时,操作次数不受影响取决于前面的情况

if(word[i-1] == word2[j-1]) dp[i][j] = dp[i-1][j-1] + 1;

两个字符不相同时,那么就要删除一个字符(操作次数+1)  或是 删除两个字符(操作次数+2)

else dp[i][j] = max(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])

4)遍历顺序

根据递推公式,从前向后遍历,从左向右遍历

for(int i = 1; i <= word1.size(); i++){

        for(int j = 1; j < word2.size(); j++){

        }

}

代码

class Solution {
public:int minDistance(string word1, string word2) {//定义dp数组vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));for(int i = 0; i <= word1.size(); i++){dp[i][0] = 0;}for(int j = 0; j <= word2.size(); j++){dp[0][j] = 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-1][j-1], max(dp[i-1][j], dp[i][j-1]));}}}return word1.size() + word2.size() - 2 * dp[word1.size()][word2.size()];}
};
  • 时间复杂度: O(n * m)
  • 空间复杂度: O(n * m)

题目4  72 编辑距离

题目链接 72 编辑距离

题意

返回将word1转换为word2的最小次数(可以插入\删除\替换一个字符)

添加元素和删除元素是一个等价的操作(在word1中添加元素等价于在word2中删除元素)而替换操作是一个新的动作,需要另外考虑

动态规划

1)确定dp数组及下标i的含义

dp[i][j] 以word1[i-1]结尾的word1和以word2[j-1]结尾的word2相同的最小操作次数

2)dp数组初始化

根据递推公式 dp[i][0] = i   dp[0][j] = j  其他下标对应的dp[i][j]可以初始化为任意值。

3)递推公式

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]+1);

注意本题多了一个操作就是替换的操作  而添加操作与删除操作是等价的

4)遍历顺序

根据递推公式 从上到下遍历,从左往右遍历

for(int i = 1; i <= word1.size(); i++){

        for(int j = 1; j <= word2.size(); j++){

        }

]

5)打印dp数组

代码

class Solution {
public:int minDistance(string word1, string word2) {//定义dp数组vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));//dp数组初始化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] + 1, min(dp[i-1][j] + 1, dp[i][j-1] + 1));}}return dp[word1.size()][word2.size()];}
};
  • 时间复杂度: O(n * m)
  • 空间复杂度: O(n * m)

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

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

相关文章

城市预约挂号统一平台的实现

目录 一、需求分析 二、界面设计 ​ 三、前端开发 四、代码下载 一.需求分析 二、界面设计 三、前端开发 <!DOCTYPE html> <html lang"zh-ch"> <head><meta charset"UTF-8"><title>基本样式页</title><link rel…

宜搭无权查询该应用信息,唯一排查码:21081d4e17130865292352743e9ed8

这种问题可能是关联表单出现了问题&#xff0c;当前应用中没有这个表单 所以就出现了应用无权访问的问题

【第二十四篇】使用Burpsuite实现反射、储存、DOM型XSS(靶场实战案例)

目录 反射性XSS储存型XSSDOM XSS反射性XSS 搜索1后,审查元素: 猜测<font>标签中没有进行XSS特殊字符转义,而在<font>标签内,可使用<script>标签: <script>alert(1)</script>储存型XSS 该模块对姓名、电子邮件、网站做过滤处理,但评论处…

基于深度学习的生活垃圾智能分类系统(微信小程序+YOLOv5+训练数据集+开题报告+中期检查+论文)

摘要 本文基于Python技术&#xff0c;搭建了YOLOv5s深度学习模型&#xff0c;并基于该模型研发了微信小程序的垃圾分类应用系统。本项目的主要工作如下&#xff1a; &#xff08;1&#xff09;调研了移动端垃圾分类应用软件动态&#xff0c;并分析其优劣势&#xff1b;分析了深…

鸿蒙开发学习笔记第一篇--TypeScript基础语法

目录 前言 一、ArkTS 二、基础语法 1.基础类型 1.布尔值 2.数字 3.字符串 4.数组 5.元组 6.枚举 7.unkown 8.void 9.null和undefined 10.联合类型 2.条件语句 1.if语句 1.最简单的if语句 2.if...else语句 3.if...else if....else 语句 2.switch语句 5.函数…

Java 入门教程||Java 关键字

Java 关键字 Java教程 - Java关键字 Java中的关键字完整列表 关键词是其含义由编程语言定义的词。 Java关键字和保留字&#xff1a; abstract class extends implements null strictfp true assert const false import package super try …

bugku-web-文件包含2

页面源码 <!-- upload.php --><!doctype html><html><head><meta charset"utf-8"/><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-widt…

技术周刊的转变:如何平衡热爱与现实?

大家好&#xff0c;我是那个自己打脸自己的猫哥&#xff0c;本来说周刊不做订阅制的&#xff0c;现在却推出了订阅专栏。今天想为自己辩护一下&#xff0c;同时聊聊技术周刊今后的发展计划。 首先回顾一下我过去的想法吧&#xff0c;然后再解释为什么会突然出现转变。 出于对…

如何进行宏观经济预测

理性预期经济学提出了理性预期的概念&#xff0c;强调政府在制定各种宏观经济政策时&#xff0c;要考虑到各行为主体预期对政策实施有效性的影响&#xff0c;积极促成公众理性预期的形成&#xff0c;从而更好地实现宏观调控的目标。政府统计要深入开展统计分析预测研究&#xf…

poi-tl的使用(通俗易懂,全面,内含动态表格实现 包会!!)

最近在做项目时候有一个关于解析Html文件&#xff0c;然后将解析的数据转化成word的需求&#xff0c;经过调研&#xff0c;使用poi-tl来实现这个需求&#xff0c;自己学习花费了一些时间&#xff0c;现在将这期间的经验总结起来&#xff0c;让大家可以快速入门 poi-tl的介绍 …

979: 输出利用先序遍历创建的二叉树的后序遍历序列

解法&#xff1a; #include<iostream> using namespace std; struct TreeNode {char val;TreeNode* left;TreeNode* right;TreeNode(char c) :val(c), left(NULL), right(NULL) {}; }; TreeNode* buildTree() {char c;cin >> c;if (c #) {return NULL;}TreeNode*…

Android图形显示架构概览

图形显示系统作为Android系统核心的子系统&#xff0c;掌握它对于理解Android系统很有帮助&#xff0c;下面从整体上简单介绍图形显示系统的架构&#xff0c;如下图所示。 这个框架只包含了用户空间的图形组件&#xff0c;不涉及底层的显示驱动。框架主要包括以下4个图形组件。…

内网通如何去除广告,内网通免广告生成器

公司使用内网通内部传输确实方便&#xff01;但是会有广告弹窗推送&#xff01;这个很烦恼&#xff01;那么如何去除广告呢&#xff01; 下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1CVVdWexliF3tBaFgN1W9aw?pwdhk7m 提取码&#xff1a;hk7m ID&#xff1a;…

mysql dll文件的缺失和Can‘t connect to MySQL server on ‘localhost‘ (10061)

个人笔记&#xff08;整理不易&#xff0c;有帮助&#xff0c;收藏点赞评论&#xff0c;爱你们&#xff01;&#xff01;&#xff01;你的支持是我写作的动力&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 个人随笔…

InternlM2

第一次作业 基础作业 进阶作业 1. hugging face下载 2. 部署 首先&#xff0c;从github上git clone仓库 https://github.com/InternLM/InternLM-XComposer.git然后里面的指引安装环境

【自研网关系列】请求服务模块和客户端模块实现

&#x1f308;Yu-Gateway&#xff1a;&#xff1a;基于 Netty 构建的自研 API 网关&#xff0c;采用 Java 原生实现&#xff0c;整合 Nacos 作为注册配置中心。其设计目标是为微服务架构提供高性能、可扩展的统一入口和基础设施&#xff0c;承载请求路由、安全控制、流量治理等…

【机器学习】数学基础详解

线性代数&#xff1a;构建数据的骨架 数学对象 标量&#xff08;Scalar&#xff09; 标量是最基本的数学对象&#xff0c;代表了单个的数值&#xff0c;无论是整数还是实数。在机器学习中&#xff0c;标量可以用来表示一个模型的单个参数&#xff0c;如偏差&#xff08;bias&…

如何更好地理解 Vue 3 watch 侦听器的用法

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

分类预测 | Matlab实现RIME-LSSVM霜冰算法优化最小二乘支持向量机数据分类预测

分类预测 | Matlab实现RIME-LSSVM霜冰算法优化最小二乘支持向量机数据分类预测 目录 分类预测 | Matlab实现RIME-LSSVM霜冰算法优化最小二乘支持向量机数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现RIME-LSSVM霜冰算法优化最小二乘支持向量机数…

【C++庖丁解牛】哈希表/散列表的设计原理 | 哈希函数

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 前言1.哈希概念2.哈希冲突…