力扣115:不同的子序列

  • 题目
  • 思路
  • 代码

题目

给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数。

测试用例保证结果在 32 位有符号整数范围内。

思路

首先我们来考虑特殊情况,当s串的长度小于t串时s串肯定就没有t串了。其他情况我们就需要想一想怎么做了,如果按照暴力做法我们就遍历s串先找到t串的第一个字符然后再找第二个第三个,也就是一个一个字符的匹配,问题是题目设置的是s串的子序列而不是子串,子序列是不需要连续的所以这就导致找到了第一个字符后可能会有很多个第二个字符也就导致我们的时间复杂度会很高。那么我们是否可以换一种思想,既然是要一个一个的匹配也就是我们可以把两个字符串拆分成一个一个的字符,我们定义一个二维数组dp,设s串的下标为i,t串的下标为j。我们设dp[i][j]是s[i,…]也就是i位置到末尾的s子串种t[j,…]即j到末尾的t子串的数量,简单来说我们就是把这个问题分成了一个一个的子问题,我们利用这个二维数组来移动i和j从而得到不同的s子串中不同的t子串出现的个数。然后再找寻其中的规律推导出状态转移方程出来,所以我们是利用了动态规划的思想,把大问题分成小问题。
那么这个二维数组dp我们要如何定义呢?我们需要定义成一个(n+1)*(m+1)的,n为s串的长度m为t串的长度。为什么要+1呢因为我们需要我们从这两个子串是空串的情况开始,当s为空串t不为空串时dp[i][j] = 0因为一个空串里怎么可能有非空串,当s为非空串t为空串时dp[i][j] =1因为一个空串是任意一个非空串的子序列。所以dp[i][0] = 1( 0 <= i <= n)。在对特殊情况进行讨论后我们现在就要移动i和j来得到每一个子问题的答案了,这里需要分成两种情况。

  1. s[i-1] == t[j-1]
    当此位置的字符相同时,我们需要考虑一个问题那就是这个字符是需要匹配的吗,这是什么意思呢。我们还需要回顾一下题目说的是s串的子序列中t出现的个数,是子序列所以不是连续的所以在这两个相等的字符前面可能还有和t[j]相同的s[i],所以我们需要讨论这两种情况例如s:tbabag,t:bag。s的第一个a不是一定要和t的a进行匹配的也可以让后面那个a来和t的a进行匹配,这就是为什么要考虑是否需要匹配。如果两个字符匹配了那么此时的dp[i][j] = dp[i-1][j-1],也就是我们需要考虑t[j-1,…]作为s[i-1,…]的子序列的情况了,如果不匹配此时的dp[i][j] = dp[i-1][j],因为不匹配也就是这个i被跳过了我们就需要考虑t[j]作为s[i-1]的子序列的情况了。
  2. s[i]-1 != t[j-1]
    如果两个字符不同就说明无法匹配,dp[i][j] = dp[i+1][j]。

代码

class Solution {
public:int numDistinct(string s, string t) {int n = s.length();int m = t.length();if (n < m) {return 0;}//dp[i][j]代表t中从0到j的子串作为s中从0到i的子串的子序列的个数vector<vector<unsigned long long>> dp(n + 1, vector<unsigned long long>(m + 1));for (int i = 0; i <= n; i++) {dp[i][0] = 1;}for (int i = 1; i <= n; i++) {char si = s[i-1];for (int j = 1; j <= m; j++) {char tj = t[j-1];if (si == tj) {dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];} else {dp[i][j] = dp[i - 1][j];}}}return dp[n][m];}
};

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

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

相关文章

2004-2023年各省生活垃圾无害化处理率数据(无缺失)

2004-2023年各省生活垃圾无害化处理率数据&#xff08;无缺失&#xff09; 1、时间&#xff1a;2004-2023年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;生活垃圾无害化处理率 4、范围&#xff1a;30省 5、指标解释&#xff1a;生活垃圾无害化处理率指报…

【Python练习题】Python小白必练100题答案-第21-40题

练习题直达链接Python小白必练100题答案-第1-20题点我直达Python小白必练100题答案-第21-40题点我直达Python小白必练100题答案-第41-60题点我直达Python小白必练100题答案-第61-80题点我直达Python小白必练100题答案-第81-97题点我直达目录专栏导读循环结构 字符串操作第三部…

添加⽂件--场景⼆

添加⽂件–场景⼆ 学习到这⾥&#xff0c;我们已经清楚了如何向仓库中添加⽂件&#xff0c;并且对于⼯作区、暂存区、版本库也有了⼀定的认识。那么我们再展⽰⼀种添加⽂件的场景&#xff0c;能加深对⼯作区、暂存区、版本库的理解&#xff0c;⽰例如下&#xff1a; roothcss-e…

华为网路设备学习-31(BGP协议 六)

BGP路由属性的几种常见使用方法&#xff1a; 29章是 BGP路由汇总 与 as-path-filter&#xff08;正则表达式&#xff09; 30章是 Community 的使用方法 本章是 ip前缀列表ip-prefix 、 路由过滤 filter-policy 和路由策略 route-policy 一、在BGP中的 ip前缀列表&#xf…

Windows PostgreSQL JDBC驱动安装包位置

要在Windows系统上获取PostgreSQL JDBC驱动安装包&#xff08;后缀为.jar的文件&#xff09;&#xff0c;可通过以下官方及常用渠道获取&#xff0c;具体位置如下&#xff1a; ###&#x1f527; 1. 官方网站下载&#xff08;推荐&#xff09; 下载地址&#xff1a;https://jdb…

机器学习从入门到精通 - 聚类算法大比拼:K-Means、DBSCAN实战与评估陷阱

机器学习从入门到精通 - 聚类算法大比拼&#xff1a;K-Means、DBSCAN实战与评估陷阱 开场白&#xff1a;推开无监督学习的大门 朋友们&#xff0c;不知道你们有没有对着堆积如山、没有标签的数据发过愁&#xff1f;想从里面找出点规律&#xff0c;分组什么的&#xff0c;结果发…

AI 重构内容创作:从文案生成到视频剪辑,创作者该如何与 AI 协同共生?

一、引言&#xff1a;AI 掀起内容创作的 “重构浪潮”​行业现象引入&#xff1a;列举 AI 在内容创作领域的爆发式应用案例&#xff08;如某平台 AI 文案工具日生成量破百万、AI 视频剪辑软件用户增长超 300%&#xff09;​创作者需求变化&#xff1a;通过调研数据说明创作者对…

后端一次性返回十万条数据时,前端需要采用多种性能优化策略来避免页面卡顿

当后端一次性返回十万条数据时&#xff0c;前端需要采用多种性能优化策略来避免页面卡顿。以下是主要的优化方案&#xff1a; 分页加载 - 将数据分批次加载显示虚拟滚动 - 只渲染可视区域内的数据数据懒加载 - 按需加载数据Web Workers - 在后台线程处理数据时间切片 - 分散渲染…

基于-轻量级文档搜索系统的测试报告

文章目录一、项目背景二、项目功能三、测试计划&#xff08;一&#xff09;测试用例设计&#xff08;二&#xff09;测试用例实现1.功能测试2.界面测试3.兼容性测试4.易用性测试5.安全性测试一、项目背景 1.基于轻量级文档检索系统采用C技术栈来实现&#xff0c;同时使用了本地…

编辑器vim(Linux)

Linux下开发工具是独立的写代码——编辑器 vim编译代码——gcc/g调试——gdb、cgdb构建工具——makefile、make、cmakevim只用来写代码注意&#xff1a;直接用vim打开一个不存在的文件并保存退出&#xff0c;就会自动生成该文件vim有多种模式命令模式&#xff08;Normal Mode&a…

GitLab,2025最新如何配置中的SSH key步骤

电脑右键先检查&#xff0c;是否有公钥 git cat ~/.ssh/id_rsa.pub下面是有&#xff0c;不用生成公钥&#xff0c;没有就要生成生成本地电脑公钥, 建议用第二种 //第一种ssh-keygen -t rsa//第二种------- 1.打开git bash,输入&#xff1a;ssh-keygen -t rsa -C “你的邮箱”ss…

华为HCIE证书多久续一次费?费用多少?

根据华为官方政策&#xff0c;华为认证HCIE的有效期为3年&#xff0c;有效期自证书正式发放之日起计算&#xff0c;考生可通过华为人才在线官网登录个人账号&#xff0c;在“我的证书”栏目中查询具体有效期起止时间。一、HCIE证书到期后的续证方式 1.重考对应HCIE的认证考试&a…

提升文本到图像强化学习稳定性:Pref - GRPO算法如何革新图像生成?

提升文本到图像强化学习稳定性&#xff1a;Pref - GRPO算法如何革新图像生成&#xff1f; 在文本到图像生成领域&#xff0c;强化学习正重塑着模型与人类偏好的对齐方式。本文聚焦于一种创新的基于成对偏好奖励的GRPO方法&#xff08;Pref - GRPO&#xff09;&#xff0c;它通…

Linux UDisks守护进程曝本地提权漏洞CVE-2025-8067,PoC已发布

漏洞概述安全研究人员在Linux环境中广泛使用的磁盘管理组件UDisks守护进程中&#xff0c;发现了一个严重漏洞&#xff08;编号CVE-2025-8067&#xff0c;CVSS评分8.5&#xff09;。该漏洞已报告给红帽产品安全团队&#xff0c;并在UDisks更新版本中得到修复。技术细节该漏洞存在…

uniapp 开发上架 iOS App全流程

操作文档网址&#xff1a;https://ask.dcloud.net.cn/article/152 操作学习视频地址&#xff1a;uniapp打包上线微信小程序、安卓、IOS流程_哔哩哔哩_bilibili 第一步&#xff1a;注册苹果 iOS 个人开发者账号 费用说明 ‌个人开发者账号‌&#xff1a;适用于独立开发者或小…

Sqlsugar补充自定义模板

DBFirst默认创建所有实体CreateClassFile()的第二个参数为生成实体类命名空间//.net6以下 db.DbFirst.IsCreateAttribute().CreateClassFile("c:\\Demo\\1", "Models"); //.net6以上 string加? db.DbFirst.IsCreateAttribute().StringNullable().CreateCl…

LeetCode 392.判断子序列

给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是"abcde"的一个子序列&#x…

逻辑回归:从原理到实战的完整指南

在机器学习中&#xff0c;分类任务是最常见的应用场景之一。而逻辑回归&#xff08;Logistic Regression&#xff09;&#xff0c;尽管名字中有“回归”&#xff0c;实际上是一种非常强大且广泛应用的二分类模型。它简单、高效、可解释性强&#xff0c;是数据科学初学者入门分类…

鸿蒙搭配前端开发:应用端与WEB端交互

鸿蒙系统&#xff08;HarmonyOS&#xff09;是华为开发的一款面向全场景的分布式操作系统&#xff0c;其设计初衷是为了适应物联网时代的需求&#xff0c;旨在构建一个统一的操作系统&#xff0c;支持多种设备的无缝协同工作。其分布式开发的一些主要优势&#xff1a; 跨设备协…

配置sscms时被sql server处处刁难

今天要记下来的是一个小例子。接前面&#xff0c;当我终于完成sql server的安装时&#xff0c;才发现要填写sscms的两个空是有多么艰难。首先安装sql server2016出现了太多环境不兼容的问题&#xff0c;让我只好退而安装sql server2012。安装sql server2012时其实是可以避坑的&…