力扣题解(不同的子序列)

115. 不同的子序列

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

思路:

本题研究的是t在s中出现的次数,注意t一定是小的那个,是s的子串。

dp[i][j]表示t的(0-i)位置的子串由s的(0-j)位置子串所表示的所有 可能。

则此时dp[i][j]需要分成两种情况,一种是包含s[j]的数值,一种是不包含s[j]的数值(之所以这么做,和题目要求是有关的,因为本题要的是所有出现次数,则包含s[j]出现次数一定和不包含s[j]出现次数不重叠,且二者可以表示所有可能,因此这么设计)则此时若包含s[j],则必须由t[i]=s[j],不然s[j]是一定不包含的(因为此时t[i]是一定要被表示的,且是最末尾的一个字符,而s[j]也是最末尾一个字符,二者必须相同).若不包含s[j],则是由s的(0-j-1)来表示t的(0-i).

故dp[i][j]=dp[i][j-1]+dp[i-1][j-1](若数值相同才加这一部分)。

初始时,当i=0,则表示s要表示空串,则一定有且只有一种表示方式(因为s不管是不是空,也只能提出来一个空串)。

在处理这种类似可以组成的所有可能时,一般都利用动态规划,因为再额外加一个字符的所有可能一定是与不加这个字符的可能有关。再者,对于求所有数目,一般初始化需要注意,因为一般不能是默认值零,因为后面加一个字符时的数目一般是用“+=”,而不是常见的xx+k(k是个常数),所以若开始初始化是0,则很有可能所有可能全是0,根本无法出现累加的情况(累加是对各种可能的加合,而全是0则没办法往上走)。

对于同时考虑两个字符串的题,一般是用多维,一维表示一个字符串。不能用一维表示,因为一维无法同时保存太多的信息,只能对一个字符串的某些信息存储,而会忽略对另一个字符串的信息的保存。

再者,需要考虑dp[i][j]的意义,此处dp[i][j]常见的就是表示(0-i),(0-j)的什么,或者表示i到j的什么,具体跟题目要求有关,但一般dp[i][j]求解都是需要和i,j位置元素挂钩的,有时也可能只和其中一个元素挂钩,但无论怎么样,一般都是会将情况分成两种分别探讨,化成两种的好处是清新且方便,若是化成多种情况很容易出现混乱,重叠。

class Solution {
public:
    int numDistinct(string s, string t) {
    
      int n1=t.size();
      int n2=s.size();
      vector<vector<long long>>dp(n1+1,vector<long long>(n2+1,0));
   for(int j=0;j<=n2;j++)
   dp[0][j]=1;
    
      for(int i=1;i<=n1;i++)
      {
        for(int j=1;j<=n2;j++)
        {
          dp[i][j]+=dp[i][j-1];
          int k=0;
          if(t[i-1]==s[j-1])
          k=dp[i-1][j-1];
          dp[i][j]+=k;
        }

      }
     return dp[n1][n2];
    
    
    
    
        }
};

相关推荐

  1. 题解不同序列

    2024-07-14 18:46:04       26 阅读
  2. 不同序列

    2024-07-14 18:46:04       22 阅读
  3. 题解( 最长递增序列

    2024-07-14 18:46:04       24 阅读
  4. 题解( 最长定差序列

    2024-07-14 18:46:04       25 阅读
  5. 题解(最长斐波那契序列长度)

    2024-07-14 18:46:04       24 阅读
  6. 题解(摆动序列

    2024-07-14 18:46:04       20 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-14 18:46:04       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-14 18:46:04       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-14 18:46:04       57 阅读
  4. Python语言-面向对象

    2024-07-14 18:46:04       68 阅读

热门阅读

  1. 1820D-The Butcher

    2024-07-14 18:46:04       22 阅读
  2. 第二节 shell脚本基础(1)(2)

    2024-07-14 18:46:04       17 阅读
  3. 序列化和反序列化

    2024-07-14 18:46:04       19 阅读
  4. flask基础配置详情

    2024-07-14 18:46:04       16 阅读
  5. 昇思25天学习打卡营第24天|RNN实现情感分类

    2024-07-14 18:46:04       19 阅读
  6. Windows图形界面(GUI)-DLG-C/C++ - 对话框的创建实现

    2024-07-14 18:46:04       18 阅读
  7. 资源分享:红豆地球V1.247 - 免费版

    2024-07-14 18:46:04       19 阅读
  8. 部署运维之一:发展历史

    2024-07-14 18:46:04       21 阅读
  9. 力扣 hot100 -- 多维动态规划

    2024-07-14 18:46:04       18 阅读
  10. SQLite3封装类教程

    2024-07-14 18:46:04       19 阅读
  11. 代码随想录算法训练营第38天

    2024-07-14 18:46:04       29 阅读