Distinct Subsequences

原题链接Distinct Subsequences

判断字符串s中有多少个子序列和t相等,一个字符串的子序列是将字符串中若干字符删除后形成的字符串

因为子序列中字符的顺序是固定的,所以不能采用滑动窗(滑动窗常用于解决只要求个数不要求顺序的问题)。

另外,对于源字符串s,假设其字符个数为n,对于目标字符串t,假设其字符个数为m,那么若想要求字符串s中和t[0 : m-1]相等的子序列个数就需要先求和t[0 : m-2]相等的子序列个数,又需要先求和t[0 : m-3]相等的子序列个数…

所以本题可以使用动态规划求解,令dp[i][j]表示字符串s[0 : i-1]中和t[0 : j-1]相等的子序列个数,最终要求解的是dp[n][m]

另外需要考虑的是,假设字符串t为空,即m为0,那么dp[i][0]都应该为1,因为只需要将s中所有字符都删掉即可

求dp[i][j]的方法是

  • 如果s[i - 1] == t[j - 1],说明当前位置匹配,那么dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j],表示可以认为当前位置匹配计算个数和,也可以不认为当前位置匹配而在s前面寻找匹配位置
  • 如果s[i - 1] != t[j - 1],那么就老老实实的dp[i][j] = dp[i - 1][j]从s前面寻找匹配位置

代码如下

class Solution {
public:int numDistinct(string s, string t) {vector<vector<int>> dp(s.size() + 1, vector<int>(t.size() + 1, 0));/* 最重要的是这里,所有迭代的动态规划最不好理解的也都是对dp设置初值* 由于本题只要t为空,那么可以将s中所有字符删掉就获得t,所以可以为1 */for(int i = 0; i <= s.size(); ++i)dp[i][0] = 1;for(int i = 1; i <= s.size(); ++i){for(int j = 1; j <= t.size(); ++j){/* 根据是否相等执行不同操作,因为此时需要匹配t[0 : j],而只有相等是才可以允许只匹配t[0 : j-1] */if(s[i - 1] == t[j - 1])dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];elsedp[i][j] = dp[i - 1][j];}}return dp[s.size()][t.size()];}
};

迭代法最不容易理解的就是对dp设置初值,其实设置初值就是几个特殊情况,dp[0][j]或者dp[i][0],弄清楚dp[i][j]表示的含义再进行设置初值比较好

每天一道LeetCode-----计算字符串s中有多少个子序列和字符串t相等相关推荐

  1. python 字符串去重从小到大排列_python 序列(字符串、字符串、元组、集合、字典)...

    运行环境:python3.8 Anaconda 字符串 在python中,单个字符就是字符串. 字符串不可改变,使用单引号' ',双引号" ",三引号'" "' ...

  2. atoi函数_每日一道 LeetCode (50):字符串转换整数 (atoi)

    ❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...

  3. 每日一道leetcode(python)844. 比较含退格的字符串

    每日一道leetcode(python)844. 比较含退格的字符串 2021-09-05 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表 ...

  4. 一天一道LeetCode(61-90)

    一天一道LeetCode(61-90) 文章目录 一天一道LeetCode(61-90) 61.旋转链表 62.不同路径 63.不同路径 II 64.最小路径和 65.有效数字(未解决) 66.加一 ...

  5. 【一天一道Leetcode】基本计算器的延伸问题

    本篇推文共计2000个字,阅读时间约3分钟. 01 题目描述 题目描述: 给你一个字符串表达式s,请你实现一个基本计算器来计算并返回它的值. 整数除法仅保留整数部分. 示例: 输入:s = " ...

  6. leetcode17. 电话号码的字母组合--每天刷一道leetcode算法系列!

    作者:reed,一个热爱技术的斜杠青年,程序员面试联合创始人 前文回顾: leetcode1. 两数之和--每天刷一道leetcode系列! leetcode2. 两数相加--每天刷一道leetcod ...

  7. mysql按照学生分组查询_将student表按照gender字段值进行分组查询,并计算每个分组中有多少名学生_学小易找答案...

    [简答题]查询student表中一共有多少条记录 [简答题]在department表和employee表之间分别使用where查询.自连接查询 [简答题]使用DESC查看学生表和班级表 [简答题]在表 ...

  8. 【python】一道LeetCode搞懂递归算法!#131分割回文串 #以及刷LeetCode的一点点小心得 [数据结构与算法基础]

    题目:给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串.返回 s 所有可能的分割方案. # 示例 输入: "aab" 输出: [["aa",&q ...

  9. 每日一道 LeetCode (16):求 x 的平方根

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

最新文章

  1. 利用Java存储过程简化数据库操作
  2. 弗吉尼亚理工大学(Virginia Tech)NCR校区招收计算机硕士学位研究生
  3. 加载gif动图_【知乎编辑技巧】GIF动图 的插入 2020.05
  4. java读取文件内容,文件头有\ufeff
  5. php 实现百度坐标转换,PHP实现腾讯与百度坐标转换
  6. 怎样更换UC浏览器的字体?更换UC浏览器的字体的方法
  7. google浏览器打开关闭标签
  8. 激活BI Content
  9. android graphic(15)—fence
  10. linux用Vim上传.sql,真的有(很多)linux大牛用vim写项目吗?
  11. 激活函数(激励函数)理解总结
  12. 随机数相关函数rand与srand 以及drand48()与srand48
  13. matlab解简单数学规划(线性,非线性,整数规划)
  14. 『学习资料推荐』百家讲坛中国历史音频珍藏版
  15. 知识图谱与图神经网络_biji
  16. Unable to load class named
  17. Matplotlib显示图例
  18. Python实现-RRT-Rapidly-exploring Random Tree-快速搜索随机树
  19. macOS Command - pkgutil
  20. w10共享网络没有计算机,Win10网络共享找不到其它电脑怎么办?

热门文章

  1. c语言中switch语句流程图_C语言:C语言保留字(关键字)
  2. Java黑皮书课后题第4章:*4.18(学生的专业和年级)编程一个程序,提示用户输入两个字符,显示这两个字符代表的专业以及年级,第一个字符表示专业,第二个是一个数字字符1、2、3、4,输出对应结果
  3. sonar 匿名内部类写法不推荐
  4. js数组去重的三种常用方法
  5. RSA 公钥加密——私钥解密
  6. var和dynamic的区别及如何正确使用dynamic ?
  7. using可以用于释放操作,相当于Dispose()
  8. Unity3D 游戏引擎之平面小球重力感应详解【转】
  9. EXT核心API详解(二)-Array/Date/Function/Number/String
  10. 用Unity3D实现简单的牧师与魔鬼游戏(动作分离版)