代码随想录Day58 | 392.判断子序列 115.不同的子序列

5个4000比特大状态置换算法的设计与分析 下面是 5 个概念性、实验性的 4000 位可逆置换设计。它们都保证是双射,但未经过密码分析,不可直接用于生产系统。风格分别覆盖:三维 SPN、Feistel、可逆元胞自动机、ARX、宽轨迹/Keccak 式结构。 这 5 个设计分别代表了 SPN、Feistel、元胞自动机、ARX、宽轨迹 Keccak 五种不同风格,覆盖了主流大状态置换的构造思路。再次强调:它们只是实验性概念,若要用于实际协议,必须经过严格安全性分析。 阅读详情

代码随想录Day58 | 392.判断子序列 115.不同的子序列

392.判断子序列

文档讲解:代码随想录
视频讲解: 动态规划,用相似思路解决复杂问题 | LeetCode:392.判断子序列
状态

本题实际上上还是寻找最长的公共子序列,如果子序列长度和s字符串的长度相等那么就说明可以匹配

  1. dp数组
    dp[i][j] 表示s中0-i-1 在 t中0-j-1能匹配的最长公共子序列长度
  2. 递推公式
    考虑两种情况,s[i-1] == t[j-1]的情况 那么 dp[i][j] = dp[i-1][j-1]+1
    如果不相等,相当于t要删除j-1这个元素与s继续匹配,所以dp[i][j] = dp[i][j-1]
  3. 初始化
    最开始都初始化为0
  4. 遍历顺序
    从前向后
  5. 打印dp
class Solution {
public:
    bool isSubsequence(string s, string t) {
        if(s.size() > t.size()) return false;
        if(s.size() == 0) return true;
        vector<vector<int>> dp(s.size()+1,vector<int>(t.size()+1));
        //dp[i][j] 表示s中0-i-1 在 t中0-j-1能匹配的最长公共子序列长度
        for(int i = 0;i<=s.size();i++)
        {
            dp[i][0] = 0;
        }
        for(int j = 0;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]+1;
                }
                else
                {
                    dp[i][j] = dp[i][j-1];
                }
            }
        }
        if(dp[s.size()][t.size()] == s.size()) return true;
        return false;
    }
};

115.不同的子序列

文档讲解:代码随想录
视频讲解: 动态规划之子序列,为了编辑距离做铺垫 | LeetCode:115.不同的子序列
状态

  1. dp数组
    dp[i][j] 表示 s中0到i-1 中 出现 t[0] 到 t[j-1]的个数
  2. 递推公式
    同样有两种情况就是 s[i-1] == t[j-1]
    如果相等
  1. 用s[i-1]来匹配,那么此时符合的个数就是dp[i-1][j-1]
  2. 不用s[i-1]来匹配,因为s中可能存在重复的元素使之成立,所以符合的个数就是dp[i-1][j]
    dp[i][j] = dp[i-1][j-1]+dp[i-1][j]

如果不相等,那就只有一种可能不使用s[i-1]来匹配。dp[i][j] = dp[i-1][j]
3. 初始化
dp[i][0] 表示 从s的子串中寻找空字符串的个数 一定 为1
dp[0][j] 表示 从空字符串中寻找t的子串的个数 一定 为0
4. 遍历顺序
从前向后
5. 打印dp

class Solution {
public:
    int numDistinct(string s, string t) {
        if(s.size() < t.size()) return 0;
        //uint64_t 测试数据的长度
        vector<vector<uint64_t>> dp(s.size()+1,vector<uint64_t>(t.size()+1));

        for(int i = 0;i<s.size()+1;i++)
        {
            dp[i][0] = 1;
        }
        //对第一行的初始化要跳过两个空字符串的位置 dp[0][0]
        for(int i = 1;i<t.size()+1;i++)
        {
            dp[0][i] = 0;
        }

        for(int i = 1;i<s.size()+1;i++)
        {
            for(int j = 1;j<t.size()+1;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()];
    }
};
ANSYS APDL齿轮建模实战:从渐开线方程到完整3D模型的保姆级教程 本文详细介绍了使用ANSYS APDL进行齿轮建模的全过程,从渐开线方程的数学基础到完整3D模型的创建。通过参数化命令流实现高精度齿轮建模,特别适合机械设计和仿真分析需求。教程包含关键参数计算、APDL环境配置、单齿齿廓建模以及全齿轮阵列复制等实用技巧,帮助工程师快速掌握ANSYS APDL在齿轮建模中的应用。 阅读详情

相关推荐

【electron】- 从零到一:在electron-vite项目中集成better-sqlite3的工程化实践

本文详细介绍了在electron-vite项目中集成better-sqlite3数据库的完整工程化实践。针对原生模块的编译挑战,提供了从环境配置、路径规划、服务封装到IPC通信的解决方案,并重点解决了开发与生产环境的数据库路径分离及打包部署等核心问题,帮助开发者构建稳定高效的Electron桌面应用数据层。

weixin_29306571的博客 204

【Day58】代码随想录之动态规划_392判断子序列_115不同子序列

所以当s[i-1] == t[j-1]时候,dp[i][j]肯定包含dp[i-1][j-1]这是把s结尾的i-1和t结尾的j-1去除,是否可以加上呢?首先我想到用二维的dp数组,行表示字符串s,列表示字符串t,dp[i][j]表示s [0, i-1]与t [0, j-1]是否是子序列,dp的类型是bool类型,初始化全为false,但是由于bool类型只能表示是 或者 不是,没办法提供额外信息,所以在更新dp的时候,递推公式是dp[i][j] = dp[i-1][j-1];

weixin_46275441的博客 2138

【SPSS实战】手动实现Quade非参数协方差分析:从数据准备到结果解读

本文详细介绍了在SPSS中手动实现Quade非参数协方差分析的实战方法。当数据不满足正态分布等参数检验假设时,通过将协变量和因变量转换为秩,并利用秩回归残差进行Kruskal-Wallis组间比较,提供了一种清晰、可操作的近似解决方案。该方法有效解决了非正态数据的协变量调整问题,适用于实验研究和调查数据分析。

bean的博客 468

代码随想录刷题笔记 Day 58 | 判断子序列 No.392 | 不同的子序列 No.115

本题是要查询 s 中有多少种方法可以得到 t,比如第一个案例 s = “rabbbit”, t = “rabbit”,首先来考虑如何划分这个子问题:既然我去查询 s 有多少种方法可以得到 “rabbit” 比较困难,那能否先去找方法得到 “t” 呢?在这种情况下,你会怎样改变代码?s 的前 m 个元素和 t 的前 n 个元素的公共子序列的长度,是可以通过 m - 1 和 n - 1 组成的公共子序列的长度推出的。表示 s 的钱 i - 1 个元素和 t 的前 j - 1 个元素构成的最长公共子序列的大小。

kkq的博客 1253

从零构建高精度电子秤:HX711与STM32的时序通信陷阱与实战避坑指南

本文详细解析了使用STM32F103C8T6与HX711模块构建高精度电子秤的通信时序陷阱与实战解决方案。重点探讨了微秒级延迟实现、数据读取算法、校准方法和滤波优化,帮助开发者避开常见通信问题,提升电子秤的测量精度和稳定性。

data3的博客 782

深入解析ST MC SDK(WorkBench)工程结构:从零搭建FOC电机控制项目

本文深入解析了ST MC SDK(WorkBench)工程结构,详细介绍了如何从零搭建FOC电机控制项目。通过ST MC SDK和WorkBench工具链,开发者可以快速配置电机类型、控制策略等参数,生成完整的FOC控制工程。文章还拆解了工程结构中的核心控制模块、HAL硬件抽象层、芯片系统初始化和电机控制算法库,并提供了无传感器FOC实战技巧和常见问题排查指南,帮助开发者高效掌握STM32F407ZGT6开发板上的FOC电机控制技术。

weixin_29173777的博客 411

代码随想录算法训练营day58 || 392. 判断子序列115. 不同的子序列

因此s不选当前的位置,即类似于两者不是合适的匹配元素,要找其他的元素,所以此时是要延续上一状态dp[i-1][j],这里是在s中找有几个t,所以只会由s来判断当前t位置的元素我是否选择,所以仅仅是dp[i-1][j],而不考虑dp[i][j-1];而站在 编辑距离 的角度来看,这个dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1])的操作就是删除i位置元素或删除j位置元素,从而求取两个字符串的共同序列。不等时,按照相等时不选择的状态延续操作,赋值dp[i-1][j]即可。

旭 584

Qt+PCL实战:如何用QVTKOpenGLNativeWidget高效渲染3D点云(附完整代码)

本文深入解析了Qt与PCL结合使用QVTKOpenGLNativeWidget进行高效3D点云渲染的实战技术。通过对比传统QVTKWidget,详细介绍了QVTKOpenGLNativeWidget在渲染效率、内存占用和兼容性方面的显著优势,并提供了完整的代码示例和性能优化策略,助力开发者在工业检测、自动驾驶等领域实现更高效的点云可视化。

keras9composer的博客 687

代码随想录训练营Day 58|力扣392.判断子序列、115不同的子序列、583两个字符串的删除操作、72编辑距离

思路:这题就是判断两个字符串的最长公共子序列是不是s。其实套路都一样。下面的都是copy昨天的。dp数组的含义:dp[i][j]表示下标为0~i-1和0~j-1字符串的最长公共子序列的长度。注意到了吗,只是求这两个字符串的最长公共子序列,没有要求一定要以什么东西结尾。所以最后一个元素就是dp数组中最大的那个元素。dp数组的初始化:dp[0][j]和dp[i][0]都没有实际意义,而且为了能够推出符合实际意义的dp[1][1]应该把这些元素初始化为0。

weixin_64434454的博客 777

代码解读:使用Stable Diffusion完成相似图像生成任务

作为内容生产重要的一部分,生成相似图像是一项有意义的工作,例如很多内容创作分享平台单纯依赖用户贡献的图片已经不够了,最省力的方法就是利用已有的图片生成相似的图片作为补充。这篇博客详细解读基于Stable Diffusion生成相似图片的原理和代码。

沉迷单车的追风少年 1393

龙腾CMS downloadFile接口任意文件读取漏洞复现 [附POC]

大连网龙网络科技有限公司专注于在信息科技领域中向客户提供商业解决方案,是专业的互联网服务解决方案提供商和网络营销服务专家,为用户提供一体化的网络营销整体解决方案,龙腾CMS downloadFile接口存在任意文件读取漏洞。

薛定谔嘚喵博客 720

【Day58】代码随想录之动态规划part15(编辑距离系列问题)——判断子序列、不同的子序列

dp[i][j]:表示以i-1为结尾的s中以j-1为结尾的t的个数。

格子格鸽的个人博客 1115

仅使用 Python 创建的 Web 应用程序(前端版本)第03章Streamlit-多页面

接下来,我们将解释多页面切换。Streamlit 没有“多页面”或“页面路由”等功能。另一方面,通过根据用户动作切换要执行的功能,可以使其看起来好像存在“多个页面”。注意:我认为它类似于 SinglePageApplication (SPA)。然而,根据 React、Vue 等中使用的 URL 路径来更改页面的路由很困难。还有一个用于获取查询参数的实验性 API,但如果您确实需要这种功能,我认为认真尝试编写 React 或 Vue 是个好主意。我们来看一个通过按下按钮来切换页面的示例,如下所示。

xianyinsuifeng的博客 1327

DAY58:动态规划(子序列3)392、115

(2)当s[i - 1] 与 t[j - 1]不相等时,dp[i][j]只有一部分组成,不用s[i - 1]来匹配(就是模拟在s中删除这个元素),即:dp[i - 1][j]所以当s[i - 1] 与 t[j - 1]相等时,dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。(1)当s[i - 1] 与 t[j - 1]相等时,dp[i][j]可以有两部分组成。

weixin_43799497的博客 572

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

代码随想录算法训练营第36期DAY58

写了两个for循环,运行时间竟然是最优的,击败100%,奇怪了。今天的主题是:编辑距离。在字符串进行增删字符的操作。显然如果是求连续子序列,就可以用KMP(记得。使用二维数组来记录字符比较结果。Dp[i][j] 相同长度。

illuosion7的博客 1014

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

代码随想录Day58

代码随想录Day58,继续学习动规解决子序列问题,针对不同的子序列这道题还需要进一步理解。

qq_57596472的博客 554

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

代码随想录算法训练营Day58|LeetCode392判断子序和、LeetCode115不同的子序和

LeetCode115不同的子序和。LeetCode392判断子序和。动态规划part15。

m0_66412823的博客 172

代码随想录算法训练营29期|day58 任务以及具体安排

思路:该题属于编辑距离问题,就是要求s字符串能删几种情况变为t字符串,dp数组表示i-1中包含j-1的情况数目,递推公式分为s[i-1]==t[j-1]和不等的时候,相等的情况下,dp[i][j] = dp[i-1][j-1]+dp[i-1][j],前者代表用s[i-1]后者表示不用s[i-1]的情况,将两者相加。思路:该题与求两数组的最长公共子序列几乎是一模一样,只需要略微改变递推公式,dp[i][j] = dp[i][j-1],因为要求的是s是否是t的子序列。第九章 动态规划part15。

m0_68520551的博客 253

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 194

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 299

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 561

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 20

C语言程序设计题|有序数组插入数字冒泡排序

题目要求将一个数插入有序数组末尾,并用冒泡排序实现整体升序。代码先将输入数存入数组最后位置,再通过双重循环进行冒泡排序,每轮将较大元素向后移动,最终输出11个升序元素。该方法虽时间复杂度为O(n²),但符合题目要求,逻辑清晰,适合初学者理解排序原理。

2301_81429079的博客 747

【算法拾光】模拟|外观数列 + 数青蛙

本文总结两道模拟题解法:外观数列通过迭代统计连续数字个数生成下一项,关键在于处理末尾字符;数青蛙则模拟青蛙叫声“croak”状态转移,维护各阶段青蛙数量,记录最大并发数并确保全部完成。共性在于严格遵循流程、细致处理边界与非法情况,锻炼字符串遍历与状态管理能力。

wuqingyigexiaoba的博客 367

牛客周赛165C题(前后缀性质,递推,排序,枚举)

题目大意:给定长度为 `n` 的数组,选择 `k ∈ [1,n]`,将前 `k` 个元素整体翻转,后面的元素不变。要求操作后的整个数组非递减,统计满足条件的 `k` 的数量。题目链接:https://ac.nowcoder.com/acm/contest/141721/C。时间复杂度:O(nlogn)

2501_94316951的博客 170

【数据结构-3】算法美学之降复杂度

在while循环的循环体内,首先用临时变量保存最后一个位置的数据,再通过for循环把所有元素往后移动一位,最后把tmp中保存的值放到下标为0的位置上去。方法二的思路是:创建新数组,让原数组中后k个数据移动到新数组中前面的位置,让原数组中前numsSize-k个数据移动到新数组中后面的位置,这。这段代码的思路是:三次逆置,第一次逆置前numsSize-k个数据,第二次逆置后k个数据,最后整体逆置。这篇博文分享一道解法不一的算法题,求解过程的目的在于降低算法的时间复杂度,题源力扣。,属于空间换时间的操作。

weixin_44218929的博客 81
上一篇: 代码随想录Day57 |1143.最长公共子序列 1035.不相交的线 53. 最大子序和
下一篇: 代码随想录Day59 | 583. 两个字符串的删除操作 72. 编辑距离
sRiddle
博客等级 码龄7年 528粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值