代码随想录打卡Day45

news/2024/9/28 6:05:42 标签: 动态规划, 算法, c++, leetcode, 数据结构

今天太晚了,先写一题,剩下的明天补。

115.不同的子序列

这个一看是困难题我就直接去看视频讲解了,总结一下,这道题还是很难的。
首先这道题涉及到不连续的子序列,根据之前的经验,我第一时间想到dp数组的定义应该是考虑s[0, i]范围内,t[0,j]有dp[i][j]个,但是实际上不是这样,而是以i结尾,j结尾的套路,第一步就给我干傻了。这道题的dp数组构造还是挺难理解的,这道题dp数组的含义是:字符串s考虑以s[i - 1]结尾的字符串中, 字符串t以t[j - 1]结尾的字符串有dp[i][j]个,感觉定义就很晦涩难懂。
其次是状态转移方程,说实话我打死都想不到能这样,当s[i - 1] == t[j - 1]时,dp[i][j]不光与dp[i - 1][j - 1]有关,还和dp[i - 1][j]有关,考虑这么一个例子:
s = “bbag” , t = “bag”,当i遍历到第二个b时,如果只考虑dp[i - 1][j - 1],那么就会漏掉第一个b也匹配的情况,所以必须把这种情况考虑进去,至于为什么不考虑dp[i][j - 1],原因就在于这道题是问我们s中有多少个t,而不是t中有多少个s,所以不用考虑。
当s[i - 1] != t[j - 1]时,dp[i][j] = dp[i - 1][j],这是因为当前s的字符串不匹配,不代表s之前的字符串也一定不匹配,后面的情况必须要包含前面的情况。
初始化这里我感觉dp[i][0]的初始化还是讲的有点晦涩,感觉根据定义给出的解释太牵强了。建议还是把初始状态带进去,看看遍历s和t的首字符的情况下,需要用到的变量应该是什么样子,再根据需要对其进行初始化。
我感觉最恶心的还是题目给的输入,给的输入数值非常大,我本以为对最后返回的dp[m][n]求个余就完事了,没想到中间就直接溢出了,必须用long long 才能不报错,在中间更新dp数组的时候就必须进行求余操作,我觉得没必要这样恶心人啊。

class Solution {
public:
    int numDistinct(string s, string t) {
        //1.确定dp[i][j]的含义:字符串s考虑以s[i - 1]结尾的字符串中, 
        //  字符串t以t[j - 1]结尾的字符串有dp[i][j]个
        //2.确定递推公式dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
        //          or dp[i][j] = dp[i - 1][j];
        //3.dp数组初始化 dp[0][j] = 0;
        //              dp[i][0] = 1;(dp[0][0] == 1)
        //4.确定遍历顺序:从左往右,从上往下遍历
        //5.打印数组(省略)
        int m = s.size();
        int n = t.size();
        vector<vector<long long>> dp(m + 1, vector<long long> (n + 1, 0));
        //初始化
        for(int i = 0; i < m; i++)
            dp[i][0] = 1;
        for(int i = 1; i <= m; i++){
            for(int j = 1; j <= n; j++){
                if(s[i - 1] == t[j - 1])
                    dp[i][j] = (dp[i - 1][j - 1] + dp[i - 1][j]) % (long)(pow(10.0, 9) + 7);
                else
                    dp[i][j] = dp[i - 1][j];
            }
        }
        return dp[m][n];
    }
};

今天先这样,下播。


http://www.niftyadmin.cn/n/5680553.html

相关文章

道可云人工智能元宇宙每日资讯|西安培育打造XR产业链工作实施方案发布

道可云元宇宙每日简报&#xff08;2024年9月25日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 西安培育打造XR产业链工作实施方案发布 9月20日&#xff0c;西安市政府官网发布了《西安市人民政府办公厅关于印发培育打造XR产业链工作实施方案的通知》。其中&…

RK3568 android11 适配鼎桥MT5710-CN 5G模块

一,概述 鼎桥MT571X设备和Android系统主要通过USB接口进行数据通信,Android系统上的Linux内核需要根据鼎桥模块设备上报的USB设备接口加载USB驱动,USB驱动正确加载后,鼎桥模块才能正常工作。 Android系统中支持鼎桥模块设备相关的Linux内核驱动架构,如下图所示: 在Lin…

新书速览|Stable Diffusion-ComfyUI AI绘画工作流解析

《Stable Diffusion-ComfyUI AI绘画工作流解析》 本书内容 《Stable Diffusion-ComfyUI AI绘画工作流解析》从零开始&#xff0c;详尽系统地讲解从本地部署ComfyUI、下载安装自定义节点&#xff0c;到搭建各种工作流程的全过程。同时&#xff0c;辅以3D形象转绘、艺术二维码和证…

VGA/HDMI/DP接口和USB、串口通信协议

1、视频接口 开始之前我们先聊一聊数字信号和模拟信号&#xff0c;模拟信号和数字信号的不同之处在于它们所传输的信息的形式。模拟信号是一个连续的信号&#xff0c;可以以在无限小的时间内进行测量。数字信号则是以离散的形式进行传输&#xff0c;它的数值只能是离散的、有限…

基于微信小程序的旅游助手的设计与实现(源码+定制+文档讲解)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

【计算机网络 - 基础问题】每日 3 题(二十八)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

第二章 Redis安装

目录 一、准备工作 二、安装Redis 三、启动Redis 3.1. 前台启动&#xff08;不推荐&#xff09; 3.2. 后台启动&#xff08;推荐&#xff09; 3.3. 关闭redis Redis官网&#xff1a;Downloads - Redis 往下翻可以找到其他版本的Redis&#xff0c;或者直接访问Index o…

构建5G-TSN测试平台:架构与挑战

论文标题&#xff1a;Building a 5G-TSN Testbed: Architecture and Challenges 作者信息&#xff1a; Anna Agust-Torra, Marc Ferr-Mancebo, David Rincn-Rivera, Cristina Cervell Pastor, Sebasti Sallent-Ribes&#xff0c;来自西班牙巴塞罗那的加泰罗尼亚理工大学&…