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. JS通过正则限制 input 输入框只能输入整数、小数(金额或者现金)
  2. 服务器广播消息,c#-从服务器广播消息
  3. 三行代码实现阿拉伯数字转中文大小写转
  4. Easyui入门视频教程 第11集---Window的使用
  5. 单片机关于RAM的作用
  6. 工作312:uni-弹出框显示数据
  7. C语言 二维数组定义和使用 - C语言零基础入门教程
  8. springboot+Mybatis-plue自动生成代码
  9. 数据库级联操作mysql_Oracle数据库中的级联查询、级联删除、级联更新操作教程...
  10. MATLAB 写入 txt
  11. React 深度学习:React Core
  12. MailBee电子邮件发送接收pop3/IMAP4/SMTP套件MailBee Objects下载
  13. keeplive使用
  14. 动态矩阵控制(DMC)的简单理解及其示例
  15. 未来IT行业前景如何?
  16. word插入对勾对号
  17. 地理坐标定位和计算距离
  18. 我辞职了准备系统学习新知识和技提升自己
  19. 性能测试第七课--用户定义变量用户参数
  20. 第七十四章 Caché 函数大全 $WREVERSE 函数

热门文章

  1. python的基本语术_Python中的基本语句详细资料说明
  2. CSS样式为什么放在head中,而不放在body底部
  3. 清华大学计算机系保送,2018年北大、清华五大学科竞赛集训队保送生争夺战结果...
  4. 黑客数字雨html单页,Hei客帝国数字雨.html
  5. php接收arduino向服务器发来的请求
  6. 后缀数组求最长重复子串
  7. 手动创建数据库实例全攻略7:UNDO
  8. 解决python3与python2的pip命令冲突问题冲突(window版)
  9. FLEX实例:GOOGLE地图.
  10. 3.【练习题】构造方法与重载 定义一个网络用户类,要处理的信息有用户ID、用户密码、email地址。拓展:判断密码长度