前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >LeetCode 115. 不同的子序列(DP)

LeetCode 115. 不同的子序列(DP)

作者头像
Michael阿明
发布于 2021-02-19 01:41:28
发布于 2021-02-19 01:41:28
32800
代码可运行
举报
运行总次数:0
代码可运行

文章目录

1. 题目

给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数。

一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,“ACE” 是 “ABCDE” 的一个子序列,而 “AEC” 不是)

题目数据保证答案符合 32 位带符号整数范围。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
示例 1:
输入:S = "rabbbit", T = "rabbit"
输出:3
解释:
如下图所示,3 种可以从 S 中得到 "rabbit" 的方案。
(上箭头符号 ^ 表示选取的字母)

rabbbit
^^^^ ^^
rabbbit
^^ ^^^^
rabbbit
^^^ ^^^

示例 2:
输入:S = "babgbag", T = "bag"
输出:5
解释:
如下图所示,5 种可以从 S 中得到 "bag" 的方案。 
(上箭头符号 ^ 表示选取的字母)

babgbag
^^ ^
babgbag
^^    ^
babgbag
^    ^^
babgbag
  ^  ^^
babgbag
    ^^^

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/distinct-subsequences 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • dp[i][j] 表示 在S的前 i 个字符中,能找到T的前 j 个字符
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int numDistinct(string s, string t) {
        if(t=="") return 1;
        if(s.size() < t.size()) return 0;
        int m = s.size(), n = t.size(), i, j;
        vector<vector<long>> dp(m+1, vector<long>(n+1,0));
        for(i = 0; i <= m; ++i)
            dp[i][0] = 1;
        for(j = 1; j <= n; j++)//T字符
        {
        	for(i = 1; i <= m; i++)//S字符
        	{
        		if(s[i-1]==t[j-1])//相等时,相比下面不相等时,多了一种情况
        		//让 i, j, 匹配,前面的有多少种情况,dp[i-1][j-1]
        			dp[i][j] = dp[i-1][j-1]+dp[i-1][j];
        		else//不相等时,相当于第i个字符没有用
        			dp[i][j] = dp[i-1][j];
        	}
        }
        return dp[m][n];
    }
};

20 ms 13.4 MB

注意:空字符能从任意字符串中找到

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/07/10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
每日算法系列【LeetCode 115】不同的子序列
一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,"ACE" 是 "ABCDE" 的一个子序列,而 "AEC" 不是)
godweiyang
2020/03/24
9270
​LeetCode刷题实战115:不同的子序列
https://leetcode-cn.com/problems/distinct-subsequences/
程序员小猿
2021/01/19
4200
​LeetCode刷题实战115:不同的子序列
LeetCode 0115. 不同的子序列[动态规划详解]
字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,"ACE" 是 "ABCDE" 的一个子序列,而 "AEC" 不是)
Yano_nankai
2021/03/21
7410
LeetCode 0115. 不同的子序列[动态规划详解]
115. 不同的子序列
一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,”ACE” 是 “ABCDE” 的一个子序列,而 “AEC” 不是)
张伦聪zhangluncong
2022/10/26
4030
Leetcode 115 Distinct Subsequences
Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative posi
triplebee
2018/01/12
6780
【动态规划算法练习】day13
115. 不同的子序列 给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数。 题目数据保证答案符合 32 位带符号整数范围。
摘星
2023/10/15
1610
【动态规划算法练习】day13
[Leetcode][python]Distinct Subsequences/不同子序列
同样你可以打印出dp看结构:上半区都为0,因为不可能,dp[0][0]为1因为空转空有一种可能(不删除)
蛮三刀酱
2019/03/26
5930
动态规划:判断子序列
题目链接:https://leetcode-cn.com/problems/is-subsequence/
代码随想录
2021/04/07
6490
动态规划:判断子序列
力扣每日一刷(2023.9.21)
本题其实不使用动态规划的思路也是能够解出来的 ,并且时间复杂度 和 空间复杂度更低。 因为题目中问的是 s 是否为t 的自序列, 我们自需要顺序遍历 t ,然后对比是否 s中也出现, 并且相对顺序不能变更即可。 代码实现中有。
用户11097514
2024/05/31
900
力扣每日一刷(2023.9.21)
Leetcode No.115 不同的子序列(动态规划)
字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,"ACE" 是 "ABCDE" 的一个子序列,而 "AEC" 不是)
week
2021/11/29
4450
Leetcode No.115 不同的子序列(动态规划)
DP:两个数组的dp问题
2、如果我们的dp多开了一行一列,可以在字符串的前面多加上一个空格(s=“ ”+s),这样可以保证dp数组和字符串数组的下标映射关系是一一对应的,方便我们书写代码
小陈在拼命
2024/06/14
660
DP:两个数组的dp问题
LeetCode 1638. 统计只差一个字符的子串数目(DP)
给你两个字符串 s 和 t ,请你找出 s 中的非空子串的数目,这些子串满足替换 一个不同字符 以后,是 t 串的子串。 换言之,请你找到 s 和 t 串中 恰好 只有一个字符不同的子字符串对的数目。
Michael阿明
2021/02/19
5030
LeetCode 115. Distinct Subsequences题目分析代码
给出字符串S和字符串T,计算S的不同的子序列中T出现的个数。 子序列字符串是原始字符串通过删除一些(或零个)产生的一个新的字符串,并且对剩下的字符的相对位置没有影响。(比如,“ACE”是“ABCDE”的子序列字符串,而“AEC”不是)。 样例 给出S = "rabbbit", T = "rabbit" 返回 3
desperate633
2018/08/22
4970
【算法专题】动态规划综合篇
题目:给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。
YoungMLet
2024/03/01
1090
【算法专题】动态规划综合篇
LeetCode 编辑距离 II(DP)
1. 题目 给你两个单词 s 和 t,请你计算出将 s 转换成 t 所使用的最少操作数。 你可以对一个单词进行如下两种操作: 删除一个字符 替换一个字符 注意: 不允许插入操作 题目保证有解 示例: 输入:s = "abcdefg", t = "abdde" 输出:3 提示: 1 <= len(s), len(t) <= 200 作者:力扣 (LeetCode) 链接:https://leetcode-cn.com/leetbook/read/high-frequency-algorithm-ex
Michael阿明
2021/09/06
6080
LeetCode 0115 - Distinct Subsequences
Given a string S and a string T, count the number of distinct subsequences of S which equals T.
Reck Zhang
2021/08/11
3880
LeetCode 2002. 两个回文子序列长度的最大乘积(状态压缩+枚举状态子集+预处理)
给你一个字符串 s ,请你找到 s 中两个 不相交回文子序列 ,使得它们长度的 乘积最大 。 两个子序列在原字符串中如果没有任何相同下标的字符,则它们是 不相交 的。
Michael阿明
2022/01/07
4040
LeetCode 2002. 两个回文子序列长度的最大乘积(状态压缩+枚举状态子集+预处理)
用javascript分类刷leetcode20.字符串(图文视频讲解)2
方法1.截取字符串,循环字符串,遇到#就截掉最后一个字符,循环完毕之后,最后比较两个去除掉#退格之后的字符串是否相等,时间复杂度O(m+n),m、n是两个字符串的长度。空间复杂度O(1)
hellocoder2028
2023/01/04
7680
LeetCode: Distinct Subsequences [115]
Given a string S and a string T, count the number of distinct subsequences of T in S.
全栈程序员站长
2022/07/05
3560
LeetCode 1216. 验证回文字符串 III(DP)
给出一个字符串 s 和一个整数 k,请你帮忙判断这个字符串是不是一个「K 回文」。
Michael阿明
2021/02/19
7330
相关推荐
每日算法系列【LeetCode 115】不同的子序列
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验