码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • My Ninety-seventh Page - 不同的子序列 - By Nicolas


    这篇page是针对leetcode上的115.不同的子序列所写的。小尼先简单的说明一下这道题的意思,就是给定一个字符串s和一个字符串t,需要我们计算出s的子序列再t中出现的次数。

    这个题就是一个比较难的题目了,小尼也是先说明一下它的动态规划五部曲是怎么样的:

    1.确定dp数组(dp table)以及下标的含义:dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。

    2.确定递推公式:这一类问题,基本是要分析两种情况

    • s[i - 1] 与 t[j - 1]相等
    • s[i - 1] 与 t[j - 1] 不相等

    当s[i - 1] 与 t[j - 1]相等时,dp[i][j]可以有两部分组成。

    一部分是用s[i - 1]来匹配,那么个数为dp[i - 1][j - 1]。

    一部分是不用s[i - 1]来匹配,个数为dp[i - 1][j]。

    这里可能有同学不明白了,为什么还要考虑 不用s[i - 1]来匹配,都相同了指定要匹配啊。

    例如: s:bagg 和 t:bag ,s[3] 和 t[2]是相同的,但是字符串s也可以不用s[3]来匹配,即用s[0]s[1]s[2]组成的bag。

    当然也可以用s[3]来匹配,即:s[0]s[1]s[3]组成的bag。

    所以当s[i - 1] 与 t[j - 1]相等时,dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];

    当s[i - 1] 与 t[j - 1]不相等时,dp[i][j]只有一部分组成,不用s[i - 1]来匹配,即:dp[i - 1][j]

    所以递推公式为:dp[i][j] = dp[i - 1][j];

    3.dp数组如何初始化:从递推公式dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; 和 dp[i][j] = dp[i - 1][j]; 中可以看出dp[i][0] 和dp[0][j]是一定要初始化的。

    4.确定遍历顺序:从递推公式dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; 和 dp[i][j] = dp[i - 1][j]; 中可以看出dp[i][j]都是根据左上方和正上方推出来的。

    5、推导出dp数组即可

    小尼接下来拉一下这道题的解题代码:

    1. class Solution {
    2. public int numDistinct(String s, String t) {
    3. int[][] dp = new int[s.length()+1][t.length()+1];
    4. for(int i = 0; i < s.length() + 1 ; i++){
    5. dp[i][0] = 1;
    6. }
    7. for(int i = 1; i < s.length() + 1; i++){
    8. for(int j = 1; j < t.length() + 1; j++){
    9. if(s.charAt(i - 1) == t.charAt(j - 1)){
    10. dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
    11. }else{
    12. dp[i][j] = dp[i - 1][j];
    13. }
    14. }
    15. }
    16. return dp[s.length()][t.length()];
    17. }
    18. }

    希望上面的分析和代码可以帮助到小伙伴们~~~

  • 相关阅读:
    【毕业设计】树莓派寻迹小车 车道线检测 - 机器视觉 单片机 嵌入式 物联网
    复现MySQL的索引选择失误以及通过OPTIMIZER_TRACE分析过程
    Flutter 使用 device_info_plus 遇到的问题
    EA&UML日拱一卒 总目录
    【00】神经网络之初始化参数
    C语言:简单的用二维数组打印杨氏三角
    Jenkins pipline集成发布到K8s
    08 数据库查询(2) | OushuDB 数据库使用入门
    Dragonframe是一个全功能的动画制作工具,专为满足电影,广播电视和电影的要求设计。
    Excel 数据透视表教程大全之 02 添加字段、设置数据格式应用货币模式、按值进行排序(教程含样本数据)
  • 原文地址:https://blog.csdn.net/weixin_51658729/article/details/128193736
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号