不同的子序列-java

  • 题目描述(力扣题库115):

    • 给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数,结果需要对 109 + 7 取模。

      示例 1:

      输入:s = "rabbbit", t = "rabbit"输出3
      解释:
      如下所示, 有 3 种可以从 s 中得到 "rabbit" 的方案。rabbbitrabbbitrabbbit
  • 解题思想:

    • 动态规划 : 

    • 当解决动态规划问题时,通常需要定义一个状态数组来存储中间结果。在这个问题中,我们使用二维数组 `dp` 来表示状态。`dp[i][j]` 表示在字符串 `s` 的子串 `s[i:]` 中出现字符串 `t` 的子串 `t[j:]` 的次数。

      首先,我们从字符串的末尾开始向前遍历。这是因为我们需要依赖后面的状态来计算当前状态。我们将 `dp[i][t.length()]` 初始化为 1,因为对于任何非空字符串 `s`,其末尾与空字符串匹配的次数都是 1。

      然后,我们从 `s` 和 `t` 的末尾开始逐个字符进行比较。如果 `s[i]` 与 `t[j]` 相等,则意味着我们有两种选择:

      1. 保留 `s[i]`,并且尝试匹配 `s[i + 1:]` 和 `t[j + 1:]`,所以此时的状态转移方程为 `dp[i][j] = dp[i + 1][j + 1]`。
      2. 匹配 `s[i]` 和 `t[j]`,然后尝试匹配 `s[i + 1:]` 和 `t[j:]`,所以此时的状态转移方程为 `dp[i][j] += dp[i + 1][j]`。

      如果 `s[i]` 与 `t[j]` 不相等,则意味着我们不能匹配当前字符,只能选择保留 `s[i]` 并尝试匹配 `s[i + 1:]` 和 `t[j:]`,所以状态转移方程为 `dp[i][j] = dp[i + 1][j]`。

      通过不断地更新状态数组 `dp`,最终我们就可以得到整个字符串 `s` 和 `t` 的子序列匹配次数,即 `dp[0][0]`。

      这种动态规划的解法利用了子问题的重叠性质,避免了重复计算,从而实现了高效的解决方案。

  • 解题步骤: 

  1. 初始化状态数组

    • 创建一个二维数组 dp,其大小为 (s.length() + 1) × (t.length() + 1)
    • 初始化 dp[i][t.length()] = 1,表示任何非空字符串 s 的末尾与空字符串匹配的次数都是 1。
  2. 逆向遍历字符串

    • 从 s 和 t 的末尾开始向前遍历字符。
    • 遍历的范围是 i = s.length() - 1 到 0,以及 j = t.length() - 1 到 0
  3. 状态转移

    • 对于当前位置 (i, j),判断 s[i] 和 t[j] 是否相等:
      • 如果相等,则有两种选择:
        • 保留 s[i],并尝试匹配 s[i + 1:] 和 t[j + 1:],更新状态:dp[i][j] = dp[i + 1][j + 1]
        • 匹配 s[i] 和 t[j],并尝试匹配 s[i + 1:] 和 t[j:],更新状态:dp[i][j] += dp[i + 1][j]
      • 如果不相等,则只能保留 s[i],并尝试匹配 s[i + 1:] 和 t[j:],更新状态:dp[i][j] = dp[i + 1][j]
  4. 返回结果

    最终的结果存储在 dp[0][0] 中,表示整个字符串 s 和 t 的子序列匹配次数。

通过以上步骤,可以得到字符串 s 和 t 的子序列匹配次数。这个算法的时间复杂度为 O(mn),其中 m 是字符串 s 的长度,n 是字符串 t 的长度。

  • 以下是代码实现: 
    • class Solution {public int numDistinct(String s, String t){if(s.length() < t.length()) return 0;int[][] dp = new int[s.length() + 1][t.length() + 1];for (int i = 0; i <= s.length(); i++) {dp[i][t.length()] = 1;}for (int i = s.length() - 1; i >= 0; i--) {for (int j = t.length() - 1; j >= 0; j--) {if(s.charAt(i) == t.charAt(j))dp[i][j] = dp[i + 1][j + 1] + dp[i + 1][j];elsedp[i][j] = dp[i + 1][j];}}return dp[0][0];}
      }

  

  •                       以上是本篇文章的全部内容, 感谢观看

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

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

相关文章

小型企业网络安全指南

许多小型企业刚刚起步&#xff0c;没有大公司所拥有的相同资源来保护其数据。他们不仅可能没有资金来支持多样化的安全计划&#xff0c;而且也可能没有人力或时间。 网络犯罪分子知道小型企业缺乏这些资源&#xff0c;并利用这些资源来谋取利益。遭受网络攻击后&#xff0c;小…

hyperf websocket

composer require hyperf/websocket-server 配置 Server 修改 config/autoload/server.php&#xff0c;增加以下配置。 <?phpreturn [servers > [[name > ws,type > Server::SERVER_WEBSOCKET,host > 0.0.0.0,port > 9502,sock_type > SWOOLE_SOCK_TCP…

2024年河北省网络建设与运维-省赛-nginx 和tomcat 服务服务步骤

题目&#xff1a; 5.nginx 和tomcat 服务 任务描述&#xff1a;利用系统自带tomcat&#xff0c;搭建 Tomcat网站。 &#xff08;1&#xff09;配置 linux2 为 nginx 服务器&#xff0c;网站目录为/www/nginx&#xff0c;默认文档 index.html 的内容为“HelloNginx”&#xf…

Rust与Go的对比

在各个领域&#xff0c;Rust 都已经成为一流的语言。最近&#xff0c;我们通过将服务的实现从 Go 切换到 Rust&#xff0c;极大地提升了该服务的性能。这里我阐述了重新实现服务为何是有价值的、该过程是如何实现的以及由此带来的性能提升。 Read States 服务 我们从 Go 切换…

01 Php学习:导学篇

Php是什么&#xff1f; PHP 是服务器端脚本语言。 PHP&#xff08;Hypertext Preprocessor&#xff09;是一种通用开源脚本语言&#xff0c;主要用于服务器端开发。PHP脚本在服务器端执行&#xff0c;生成动态网页内容或执行服务器端任务。PHP可以嵌入到HTML中&#xff0c;也…

千视携 NDI 6 轻量化媒体方案亮相北京CCBN展会

展会简介 第30届中国国际广播电视网络技术展览会&#xff08;CCBN&#xff09;将于4月24至26日在北京首钢会展中心举行。此次展会将汇集全球各大数字媒体、广播电视单位以及IT、通信技术厂商。展会重点关注数字化转型、智能媒体、融媒体等主题&#xff0c;并展示最新的5G、4K/8…

MongoDB聚合运算符:$min

文章目录 语法使用空值和缺失值的处理数组操作数的处理 举例在$group阶段使用在$setWindowFields阶段使用在$project阶段使用 $min聚合运算符用于返回最小值。$min对于不同的类型的值使用BSON的比较顺序。 $min可以用于下面的这些阶段&#xff1a; $addFields$bucket$bucketA…

【运输层】TCP 的可靠传输是如何实现的?

目录 1、发送和接收窗口&#xff08;滑动窗口&#xff09; &#xff08;1&#xff09;滑动窗口的工作流程 &#xff08;2&#xff09;滑动窗口和缓存的关系 &#xff08;3&#xff09;滑动窗口的注意事项 2、如何选择超时重传时间 &#xff08;1&#xff09;加权平均往返…

5.网络编程-socker(golang版)

目录 一、什么是socket&#xff1f; 二、Golang中使用TCP TCP服务端 TCP客户端​​​​​​​ 三、TCP黏包&#xff0c;拆包 1.什么是粘包&#xff0c;拆包&#xff1f; 2.为什么UDP没有粘包&#xff0c;拆包&#xff1f; 3.粘包拆包发生场景 4.TCP黏包 黏包服务端 …

解决 IDEA每次打开新的项目都要重新设置maven问题

目录 一、当前项目设置maven 如下图&#xff1a; 二、设置打开的新项目的maven 如下图&#xff1a;​ 一、当前项目设置maven 对于当前项目我们都知道设置maven的配置要在 File -- Settings -- Build -- Maven 中设置 如下图&#xff1a; 二、设置打开的新项目的maven F…

Java编程题 | 数组逆序输出

大家可以关注一下专栏&#xff0c;方便大家需要的时候直接查找&#xff0c;专栏将持续更新~ 题目描述 编写一个Java程序&#xff0c;用于接收一个整数数组作为输入&#xff0c;然后逆序输出这个数组中的所有元素。 程序需要接收一个整数数组作为输入&#xff0c;然后输…

整理的微信小程序日历(单选/多选/筛选)

一、日历横向多选&#xff0c;支持单日、双日、三日、工作日等选择 效果图 wxml文件 <view class"calendar"><view class"section"><view class"title flex-box"><button bindtap"past">上一页</button&…

初步了解Windows作业对象

Windows提供了一个作业(job)内核对象,它允许你将进程组合在一起; 起到类似沙箱的作用; 可以对作业中的进程施加平时不能施加的限制; 这程序是《Windows核心编程》中的,我只初略看了一下, #include "stdafx.h" #include "windows.h" #include "…

stm32与esp8266WIFI模块

硬件介绍 WIFI模块ESP-01S 使用AT指令控制1-ESP8266-AT指令初试化及部分基础知识_ch_pd-CSDN博客 项目需求 通过ESP-01SWIFI模块控制LED状态模拟插座 串口1用于与ESP8266通讯&#xff0c;串口2连接PC&#xff0c;用于打印log&#xff0c;查看系统状态 项目接线 将WIFI模块的…

关于在Ubuntu上配置mysql踩的一些坑

最近准备换工作了&#xff0c;回顾了下学校时期做的那个webserver&#xff0c;又在linux下mysql踩了一些坑&#xff0c;特此记录下来 程序编译错误mysql.h: No such file or directory 云服务器缺少mysql必要的运行组件&#xff0c;安装&#xff1a; sudo apt-get install l…

智慧农场物联网系统:重塑农业的未来

随着科技的进步&#xff0c;物联网技术正在逐渐改变我们的生活。在农业领域&#xff0c;物联网系统也正在发挥着越来越重要的作用&#xff0c;为智慧农场的发展提供了新的可能。本文将深入探讨智慧农场物联网系统的优势、应用场景、技术实现以及未来发展趋势。 一、智慧农场物…

ATAM方法架构评估实践

用ATAM方法评估软件体系结构&#xff0c;其工作分为4个基本阶段&#xff0c;即演示、调查和分析、测试和报告ATAM&#xff08;如图1所示&#xff09;。接下来分别就每个阶段的实践进行详细介绍。 图1 ATAM方法的评估实践阶段划分 1.阶段1——演示&#xff08;Presentation&…

Android14音频进阶之<进阶调试>:Perfetto定位系统音频问题(六十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP…

【算法 | 背包专题】分组背包(解题思路+题单)

分组背包 上一节&#xff0c;我们提到了什么是01背包&#xff0c;以及如何求解01背包&#xff1a; 【算法 | 背包专题】01背包&#xff08;状态定义状态转移解题流程题单&#xff09; 现在&#xff0c;我们来看分组背包。 分组背包问题是背包问题的一种变形。在这个问题中&…

转化延迟预估

转化数据延迟久&#xff0c;但实时反馈至关重要涉及到模型预估准度&#xff0c;进而影响客户成本。 现状&#xff1a;超过12h的转化被视为负例&#xff0c;12h以内的为正例&#xff0c;这样会导致模型低估。公示如下&#xff1a; P ( 转化 ∣ 点击 ) 延迟 ≤ 12 h 的转化 未转…