统计不同子序列出现的个数

统计不同子序列出现的个数

在本文中,我们将讨论如何解决一个有趣的问题:给定两个字符串st,我们需要统计ts的子序列中出现的个数。最终的结果需要对 1 0 9 + 7 10^9 + 7 109+7 取模。

问题描述

我们被要求统计字符串t在字符串s的子序列中出现的次数。这意味着我们需要在字符串s中找到所有可能的子序列,这些子序列可以通过删除某些字符来获得,并且这些子序列与字符串t相等。

动态规划的思路

为了解决这个问题,我们可以使用动态规划。我们定义一个二维数组 dp,其中 dp[i][j] 表示字符串 t 的前 i 个字符在字符串 s 的前 j 个字符的子序列中出现的个数。

接下来,我们可以考虑 dp[i][j] 的计算方式:

  • 如果 t[i-1] == s[j-1],那么有两种情况:
    • 我们可以选择不使用 s[j-1],也就是说 s[j-1] 不贡献到子序列中,那么 dp[i][j] = dp[i][j-1]
    • 我们可以选择使用 s[j-1],也就是说 s[j-1] 贡献到子序列中,那么 dp[i][j] = dp[i-1][j-1]
  • 如果 t[i-1] != s[j-1],那么 s[j-1] 无法贡献到子序列中,因此 dp[i][j] = dp[i][j-1]

最终,我们可以得到状态转移方程如下:

dp[i][j] = dp[i][j-1] + (t[i-1] == s[j-1] ? dp[i-1][j-1] : 0)

示例

让我们使用示例来说明上述思路。

示例 1

s = "rabbbit"
t = "rabbit"

首先,我们创建一个二维数组 dp,并初始化如下:

   r a b b b i t
r  1 1 1 1 1 1 1
a  0
b  0
b  0
i  0
t  0

现在我们按照状态转移方程填充 dp 数组:

  1. dp[1][1]:考虑字符 ‘r’ 和 ‘r’。它们相等,所以 dp[1][1] = dp[0][0] = 1

  2. dp[1][2]:考虑字符 ‘r’ 和 ‘ra’。它们不相等,所以 dp[1][2] = dp[1][1] = 1

  3. dp[1][3]:考虑字符 ‘r’ 和 ‘rab’。它们不相等,所以 dp[1][3] = dp[1][2] = 1

  4. dp[1][4]:考虑字符 ‘r’ 和 ‘rabb’。它们不相等,所以 dp[1][4] = dp[1][3] = 1

  5. dp[1][5]:考虑字符 ‘r’ 和 ‘rabbb’。它们不相等,所以 dp[1][5] = dp[1][4] = 1

  6. dp[1][6]:考虑字符 ‘r’ 和 ‘rabbbi’。它们不相等,所以 dp[1][6] = dp[1][5] = 1

  7. dp[1][7]:考虑字符 ‘r’ 和 ‘rabbbit’。它们不相等,所以 dp[1][7] = dp[1][6] = 1

现在,我们填充第一行,然后按照相同的方式填充其余行。

最终,dp[6][7] 表示字符串 “rabbit” 在字符串 “rabbbit” 的子序列中出现的次数。结果为 dp[6][7] = 3

示例 2

s = "babgbag"
t = "bag"

我们执行类似的动态规划过程,填充 dp 数组。

最终,dp[3][7] 表示字符串 “bag” 在字符串 “babgbag” 的子序列中出现的次数。结果为 dp[3][7] = 5

Java 代码实现

现在,让我们将上述思路转化为 Java 代码:

class Solution {public int numDistinct(String s, String t) {int m = s.length();int n = t.length();int[][] dp = new int[n + 1][m + 1];// Initialize the first row with 1'sfor (int j = 0; j <= m; j++) {dp[0][j] = 1;}for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {dp[i][j] = dp[i][j - 1];if (t.charAt(i - 1) == s.charAt(j - 1)) {dp[i][j] += dp[i - 1][j - 1];}}}return dp[n][m];}
}

这段代码实现了上述动态规划思路,并返回了ts的子序列中出现的次数。

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

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

相关文章

网站打不开的九个因素

网站打不开的九个因素 1. 服务器软件软件多少、稳定和软件的正确配置&#xff0c;都会影响到服务器环境&#xff0c;以致影响到网络速度。服务器安装软件防火墙&#xff0c;会牺牲一些网络速度&#xff0c;所以VPS、或独立服务器用户装一个防火墙足矣。 2. 机器的配置包括空服…

常见问题-找不到vcruntime140.dll无法继续执行代码解决方案

本文将介绍五种不同的解决方案&#xff0c;帮助大家解决这个问题。 首先&#xff0c;我们需要了解为什么会出现找不到vcruntime140.dll的情况。这种情况通常是由于以下几个原因导致的&#xff1a; 1. 系统环境变量设置不正确&#xff1a;系统环境变量中可能没有包含vcruntime…

jvm的jshell,学生的工具

jshell 在我眼里&#xff0c;只能作为学校教学的一个玩具&#xff0c;事实上官方也做了解释&#xff0c;以下是官方的解释&#xff1a; 在学习编程语言时&#xff0c;即时反馈很重要&#xff0c;并且 它的 API。学校引用远离Java的首要原因 教学语言是其他语言有一个“REPL”…

轻量级导出 Excel 标准格式

一般业务系统中都有导出到 Excel 功能&#xff0c;其实质就是把数据库里面一条条记录转换到 Excel 文件上。Java 常用的第三方类库有 Apache POI 和阿里巴巴开源的 EasyExcel 等。另外也有通过 Web 模板技术渲染 Excel 文件导出&#xff0c;这实质是 MVC 模式的延伸&#xff0c…

nfs+rpcbind实现服务器之间的文件共享

NFS简介 NFS服务及Network File System&#xff0c;用于在网络上共享存储&#xff0c;分为2,3,4三个版本&#xff0c;最新为4.1版本。NFS基于RPC协议&#xff0c;RPC为Remote Procedure Call的简写。 应用场景&#xff1a;用于A,B,C三台机器上需要保证被访问到的文件是一样…

2023阿里云双十一到底有没有活动?去年就没有

2023阿里云双十一到底有没有活动&#xff1f;根据以往经验&#xff0c;阿里云双11是一次大型促销活动&#xff0c;但是去年好像就没有&#xff0c;印象里去年阿里云没推出双十一活动&#xff0c;因为阿里云一直都活动&#xff0c;没有单独推出双11优惠&#xff0c;阿里云百科给…

发现一不错的编程助手 Amazon CodeWhisperer

Amazon CodeWhisperer 是一款 AI 编程助手&#xff0c;旨在为开发人员提供智能化的编程辅助工具。作为一款基于人工智能的编程助手&#xff0c;CodeWhisperer 的目标是提高开发人员的生产效率、降低开发成本&#xff0c;并提供高质量的编程解决方案。 1.安装过程参考官网 htt…

驱动实现LED点灯

demo.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/io.h> #include "head.h" //定义三个指针指向映射后的虚拟内存 unsigned int *vir_moder; unsigned …

YOLOv8改进实战 | 更换主干网络Backbone(四)之轻量化模型MobileNetV3

前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝:移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。分组卷积:将卷积操作分解为若干个较小的卷积操作,并将它们分别作用于输入的不…

【Qt之布局】QVBoxLayout、QHBoxLayout、QGridLayout、QFormLayout介绍及使用

在Qt中&#xff0c;布局管理器&#xff08;Layout&#xff09;用于管理窗口中的控件的位置和大小&#xff0c;以适应不同大小的窗口。 常用的布局管理器包括QVBoxLayout、QHBoxLayout、QGridLayout和QFormLayout。 先放张布局UI&#xff1a; 1. QVBoxLayout&#xff08;垂直布…

百分点科技受邀参加“一带一路”国际合作高峰论坛

10月17-18日&#xff0c;第三届“一带一路”国际合作高峰论坛在北京成功举行。作为新一代信息技术出海企业代表&#xff0c;百分点科技董事长兼CEO苏萌受邀出席高峰论坛开场活动——“一带一路”企业家大会&#xff0c;与来自82个国家和地区的企业或机构、有关国际组织、经济机…

【IBIS 模型与仿真 - IBISWriter and Write_IBIS】

本文将介绍如何从用户设计中编写自定义IBIS模型。 本文是 SelectIO 解决方案中心&#xff08;Xilinx 答复 50924&#xff09;的设计助手部分&#xff08;Xilinx 答复 50926&#xff09;的一部分。 原文链接&#xff1a;https://support.xilinx.com/s/article/50957?languagee…

2022年亚太杯APMCM数学建模大赛E题有多少核弹可以摧毁地球求解全过程文档及程序

2022年亚太杯APMCM数学建模大赛 E题 有多少核弹可以摧毁地球 原题再现 1945年8月6日&#xff0c;第二次世界大战即将结束。为了尽快结束战争&#xff0c;美国在日本广岛投下了下一颗名为“小男孩”的原子弹。这样一颗原子弹在广岛炸死了20万人&#xff0c;广岛的所有建筑物都…

VueRouter 源码解析

重要函数思维导图 路由注册 在开始之前&#xff0c;推荐大家 clone 一份源码对照着看。因为篇幅较长&#xff0c;函数间的跳转也很多。 使用路由之前&#xff0c;需要调用 Vue.use(VueRouter)&#xff0c;这是因为让插件可以使用 Vue export function initUse(Vue: GlobalAP…

数据库事务及事务隔离级别

1.什么叫数据库事务? 事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态. 一组逻辑操作单元:一个或多个DML操作. 2.事务处理的原则:保证所有事务都作为一个工作单元执行,即使出现了故障,都不能改变这种执行方式.当在一个事务中执行多个操作时,要么所有的操作都被提交(…

EDUSRC--简单打穿某985之旅

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

idea leetcode配置

idea leetcode配置 配置页面如下图所示&#xff0c;根据需要&#xff0c;填入登录用户名、密码、文件存放路径&#xff0c;注意如果要使用自定义的代码结构配置&#xff0c;要勾选图中框出来的选项。 Code FileName&#xff1a; $!velocityTool.camelCaseName(${question.tit…

金融网站如何做好安全防护措施?

联网的发展为当代很多行业的发展提供了一个更为广阔的平台&#xff0c;而对于中国的金融业来说&#xff0c;互联网金融这一新兴理念已经为 人们所接受&#xff0c;且发展迅速。我们也都知道金融行业对互联网技术是非常严格的&#xff0c;这对互联网的稳定性和可靠性提出了较高的…

[AutoSAR系列] 1.1 AutoSar 发展历史

AUTOSAR,全称为Automotive Open System Architecture,即汽车开放系统架构。 AutoSar 是一项开源的汽车软件标准,旨在提高汽车电子系统的互操作性和可重用性。AutoSar 成员通常是汽车制造商、电子元件制造商、软件供应商和工具供应商等公司,他们在共同开发和推进 AutoSar 标…

作业来了~~~

#include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include<linux/io.h> #include "head.h" unsigned int major; char kbuf[128] {}; // 定义三个指针指向映射后的虚拟内存 un…