每天一道LeetCode-----计算字符串s中有多少个子序列和字符串t相等
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相等相关推荐
- python 字符串去重从小到大排列_python 序列(字符串、字符串、元组、集合、字典)...
运行环境:python3.8 Anaconda 字符串 在python中,单个字符就是字符串. 字符串不可改变,使用单引号' ',双引号" ",三引号'" "' ...
- atoi函数_每日一道 LeetCode (50):字符串转换整数 (atoi)
❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...
- 每日一道leetcode(python)844. 比较含退格的字符串
每日一道leetcode(python)844. 比较含退格的字符串 2021-09-05 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表 ...
- 一天一道LeetCode(61-90)
一天一道LeetCode(61-90) 文章目录 一天一道LeetCode(61-90) 61.旋转链表 62.不同路径 63.不同路径 II 64.最小路径和 65.有效数字(未解决) 66.加一 ...
- 【一天一道Leetcode】基本计算器的延伸问题
本篇推文共计2000个字,阅读时间约3分钟. 01 题目描述 题目描述: 给你一个字符串表达式s,请你实现一个基本计算器来计算并返回它的值. 整数除法仅保留整数部分. 示例: 输入:s = " ...
- leetcode17. 电话号码的字母组合--每天刷一道leetcode算法系列!
作者:reed,一个热爱技术的斜杠青年,程序员面试联合创始人 前文回顾: leetcode1. 两数之和--每天刷一道leetcode系列! leetcode2. 两数相加--每天刷一道leetcod ...
- mysql按照学生分组查询_将student表按照gender字段值进行分组查询,并计算每个分组中有多少名学生_学小易找答案...
[简答题]查询student表中一共有多少条记录 [简答题]在department表和employee表之间分别使用where查询.自连接查询 [简答题]使用DESC查看学生表和班级表 [简答题]在表 ...
- 【python】一道LeetCode搞懂递归算法!#131分割回文串 #以及刷LeetCode的一点点小心得 [数据结构与算法基础]
题目:给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串.返回 s 所有可能的分割方案. # 示例 输入: "aab" 输出: [["aa",&q ...
- 每日一道 LeetCode (16):求 x 的平方根
每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...
最新文章
- 利用Java存储过程简化数据库操作
- 弗吉尼亚理工大学(Virginia Tech)NCR校区招收计算机硕士学位研究生
- 加载gif动图_【知乎编辑技巧】GIF动图 的插入 2020.05
- java读取文件内容,文件头有\ufeff
- php 实现百度坐标转换,PHP实现腾讯与百度坐标转换
- 怎样更换UC浏览器的字体?更换UC浏览器的字体的方法
- google浏览器打开关闭标签
- 激活BI Content
- android graphic(15)—fence
- linux用Vim上传.sql,真的有(很多)linux大牛用vim写项目吗?
- 激活函数(激励函数)理解总结
- 随机数相关函数rand与srand 以及drand48()与srand48
- matlab解简单数学规划(线性,非线性,整数规划)
- 『学习资料推荐』百家讲坛中国历史音频珍藏版
- 知识图谱与图神经网络_biji
- Unable to load class named
- Matplotlib显示图例
- Python实现-RRT-Rapidly-exploring Random Tree-快速搜索随机树
- macOS Command - pkgutil
- w10共享网络没有计算机,Win10网络共享找不到其它电脑怎么办?
热门文章
- c语言中switch语句流程图_C语言:C语言保留字(关键字)
- Java黑皮书课后题第4章:*4.18(学生的专业和年级)编程一个程序,提示用户输入两个字符,显示这两个字符代表的专业以及年级,第一个字符表示专业,第二个是一个数字字符1、2、3、4,输出对应结果
- sonar 匿名内部类写法不推荐
- js数组去重的三种常用方法
- RSA 公钥加密——私钥解密
- var和dynamic的区别及如何正确使用dynamic ?
- using可以用于释放操作,相当于Dispose()
- Unity3D 游戏引擎之平面小球重力感应详解【转】
- EXT核心API详解(二)-Array/Date/Function/Number/String
- 用Unity3D实现简单的牧师与魔鬼游戏(动作分离版)