首页 > 其他分享 >不同的子序列

不同的子序列

时间:2024-05-06 15:35:06浏览次数:21  
标签:匹配 不同 字符串 vector 个字符 序列 dp size

题目来源:力扣115

解法思路:使用动态规划

定义 dp[i][j]为考虑 s 中 [0,i-1]个字符,t 中 [0,j-1] 个字符的匹配个数。

那么显然对于某个dp[i][j] 而言,从「最后一步」的匹配进行分析,包含两类决策:
1、不让 s[i] 参与匹配,也就是需要让 s 中 [0,i−1]个字符去匹配 t 中的 [0,j-1]字符。此时匹配值为 dp[i][j]

2、让 s[i] 参与匹配,这时候只需要让 s 中 [0,i−2]个字符去匹配 t 中的 [0,j−1]字符即可,同时满足 s[i-1]=t[j-1]。此时匹配值为 dp[i-1][j]

最终 dp[i][j] 就是两者之和。

初始化:
根据dp[i][j]的定义需要初始化 dp[i][0]和dp[0][j]
再看看dp[i][j]的定义可以知道 dp[i][0] 全为1;dp[0][j]全为0;dp[0][0]为1

完整代码

点击查看代码
class Solution {
public:
    int numDistinct(string s, string t) {
        //因为要求的是 s字符串中有多少个t,所以s字符串长度应该大于等于t字符串长度
        if(s.size() < t.size()) return 0;

        //vector<vector<int>> dp(s.size()+1,vector<int>(t.size()+1,0));
        vector<vector<uint64_t>> dp(s.size() + 1, vector<uint64_t>(t.size() + 1));
        //dp[i][j] 表示 s串中以第i-1为结尾的字符串中包含 t串中到第j-1 为结尾的字符串个数
        //初始化
        for(int i=1;i<s.size();i++)    
            dp[i][0] = 1;   
        for(int j=1;j<t.size();j++)
            dp[0][j] = 0;
        dp[0][0] = 1;

        //遍历
        for(int i=1;i<=s.size();i++){
            for(int j=1;j<=t.size();j++){
                if(s[i-1] == t[j-1]){
                    dp[i][j] = dp[i-1][j-1] + dp[i-1][j];
                    //dp[i-1][j-1]表示使用s[i-1]
                    //dP[i-1][j]表示不使用s[i-1]
                }else{
                    dp[i][j] = dp[i-1][j];
                }
            }
        }
        return dp[s.size()][t.size()];
    }
};

标签:匹配,不同,字符串,vector,个字符,序列,dp,size
From: https://www.cnblogs.com/haof31/p/18175076

相关文章

  • 基于WOA优化的CNN-LSTM-Attention的时间序列回归预测matlab仿真
    1.算法运行效果图预览优化前:    优化后:   2.算法运行软件版本matlab2022a 3.算法理论概述       时间序列回归预测是数据分析的重要领域,旨在根据历史数据预测未来时刻的数值。近年来,深度学习模型如卷积神经网络(ConvolutionalNeuralNetwork,C......
  • 火箭上天和飞机上天的原理有何不同?
    火箭靠向后喷射高温高压气体产生的反作用力飞行。飞机靠机翼上下气流的压差产生的升力飞行。参考:https://baijiahao.baidu.com/s?id=1641924575181476234&wfr=spider&for=pc>>空气动力学:空气动力学是力学的一个分支,研究飞行器或其他物体在同空气或其他气体作相对运动情况下的受......
  • 修改序列last_value 字段
    在PostgreSQL中,你不能直接更新序列(如seq_sys_config)的last_value字段,因为序列是一个特殊的系统对象,不允许你像普通表那样直接修改它的列。last_value实际上是序列的一个伪列,表示最后返回的值,但它不是一个可以直接设置的列。如果你想要修改序列的当前值或者重置它,你应该使用......
  • LSTM时间序列预测中的一个常见错误以及如何修正
    当使用LSTM进行时间序列预测时,人们容易陷入一个常见的陷阱。为了解释这个问题,我们需要先回顾一下回归器和预测器是如何工作的。预测算法是这样处理时间序列的:一个回归问题是这样的:因为LSTM是一个回归量,我们需要把时间序列转换成一个回归问题。有许多方法可以做到这一点,一般......
  • 博客园商业化之路:融资做与众不同的众包平台,让开发能力成为一种服务(Coding as a Servi
    园子的诞生,与商业无关,是一位编程爱好者业余时间的偶然。园子的坚持,也与商业无关,是来自服务于成千上万开发者的成就感。当十多年前业余时间无法支撑园子的进一步发展时,初生牛犊不怕虎地毅然辞职从江苏扬州来到上海开始为园子的发展而创业,当时心里知道,只有商业化,才有未来。但那时......
  • Apache Shiro 721反序列化漏洞Padding Oracle Attack
    目录漏洞原理复现修复方式漏洞原理Shiro的RememberMeCookie使用的是AES-128-CBC模式加密。其中128表示密钥长度为128位,CBC代表CipherBlockChaining,这种AES算法模式的主要特点是将明文分成固定长度的块,然后利用前一个块的密文对当前块的明文进行加密处理。这种模式的加......
  • 基于WOA优化的CNN-GRU-Attention的时间序列回归预测matlab仿真
    1.算法运行效果图预览woa优化前      woa优化后    2.算法运行软件版本matlab2022a 3.算法理论概述      时间序列回归预测是数据分析的重要领域,旨在根据历史数据预测未来时刻的数值。近年来,深度学习模型如卷积神经网络(ConvolutionalNeur......
  • 105. 106. 从中序与后序遍历序列构造二叉树
    https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/思路和106.从中序与后序遍历序列构造二叉树相同/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoder......
  • 106. 从中序与后序遍历序列构造二叉树(leetcode)
    https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/要点是明白中序和后序如何构造二叉树的,并且需要理清当前递归函数的语义,不要一开始就陷入细节,而是思考整棵树与其左右子树的关系,语义是:即构造当前节点,给当前节点左右子树赋值,明......
  • Apache Shiro 550反序列化漏洞
    目录漏洞原理复现漏洞探测方式一ysoserial反弹shell方式二ShiroAttack2一键利用修复措施ApacheShiro是一个用于身份验证、授权、加密和会话管理的Java安全框架。ApacheShiro550是个反序列化漏洞,漏洞编号为CVE-2016-4437。漏洞原理Shiro框架提供了一个RememberMe功能,允许......