LeetCode 115.不同的子序列 详解
题目详情
给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数。
一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,“ACE” 是 “ABCDE” 的一个子序列,而 “AEC” 不是)
示例 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
^^^
题目详解
动态规划关键是找到递推公式, 而找到递推公式,首先就是要找到如何表示数组dp 然后找到递推关系。
我们可以发现。此题和编辑距离一样。都是由两个字符串, 是从一个字符串变到另一个字符串, 对于编辑距离这个题是在字符串1进行增, 删, 改操作变到字符串2, 此题是在字符串1里找到字符串2。
所以对于此题我们先构造dp, 类似于编辑距离, 定义dp[i][j],表示字符串1的从0开始长度为i的字符串, 和字符串2的从长度为j的字符串, 这两个字符串匹配的个数。
下面就是要找递推式了
首先开始可能递推看不出来, 所以有些做法就是写一个例子, 然后把例子的dp全部写出来, 这里就以题目的S = “rabbbit”, T = "rabbit"例子

观察到
- 最终结果是dp[S.size()][T.size()]
- 每当S[i] == T[j]时, dp[i][j]会增加, 比如S = rabb, T = rab. 此时dp[i][j] = dp[i][j-1] + x (x为增加量)
- 当S[i] != T[j]时 dp[i][j] 会不变
- x是什么呢?,对于例子S=rabbb, T=rabb, x为2, 而dp[i-1][j-1] = 2, 而且其他的例子也能推出来,所以可以假设x = dp[i-1][j-1]
- 当计算dp[i][j]时, dp[i][j-1]是一定被包括进去的, 当两个字符串的最后一个字符相同时, 那么dp[i-1][j-1]也会包括进去
通过上面的分析, 我们已经找到了递推式子
dp[i][j] = dp[i][j-1] + (s[i] == t[j]) ? dp[i-1][j-1] : 0
而且通过上面的例子 可以找到初始情况
dp[0][j] = 0;
dp[j][0] = 1; (包含空串)
dp[0][0] = 1 (防止第一个条件覆盖)
AC代码
class Solution {
public:
int numDistinct(string s, string t) {
vector<vector<int> > dp(t.size() + 1, vector<int>(s.size() + 1, 0));
//初始化dp数组
dp[0][0] = 1;
for (int i = 1; i < s.size() + 1; ++i) {
dp[0][i] = 1;
}
for (int i = 1; i < t.size() + 1; ++i) {
dp[i][0] = 0;
}
//dp循环求解
for (int i = 1; i < t.size() + 1; ++i) {
for (int j = 1; j < s.size() + 1; ++j) {
dp[i][j] = dp[i][j - 1];
if (s[j - 1] == t[i - 1])
dp[i][j] += dp[i - 1][j - 1];
}
}
return dp[t.size()][s.size()];
}
};
LeetCode 115.不同的子序列 详解的更多相关文章
- Java实现 LeetCode 115 不同的子序列
115. 不同的子序列 给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数. 一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字 ...
- LeetCode.516 最长回文子序列 详解
题目详情 给定一个字符串s,找到其中最长的回文子序列.可以假设s的最大长度为1000. 示例 1: 输入: "bbbab" 输出: 4 一个可能的最长回文子序列为 "bb ...
- Leetcode 115.不同的子序列
不同的子序列 给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数. 一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串.(例 ...
- leetcode 115不同的子序列
滚动数组: /***** 下标从1开始 dp[i][j]:= numbers of subseq of S[1:j] equals T[1:i] if(s[j]==t[i]):(那么之后的子串可以是是 ...
- LeetCode 763划分字母区间 详解
题目详情 字符串 S 由小写字母组成.我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段.返回一个表示每个字符串片段的长度的列表. 示例 1: 输入: S = "ab ...
- LeetCode(42.接雨水)多解法详解
接雨水解法详解: 题目: 基本思路:从图上可以看出要想接住雨水,必须是凹字形的,也就是当前位置的左右两边必须存在高度大于它的地方,所以我们要想知道当前位置最多能存储多少水,只需找到左边最高处max_l ...
- [原创]mybatis详解说明
mybatis详解 2017-01-05MyBatis之代理开发模式1 mybatis-Dao的代理开发模式 Dao:数据访问对象 原来:定义dao接口,在定义dao的实现类 dao的代理开发模式 只 ...
- 3.awk数组详解及企业实战案例
awk数组详解及企业实战案例 3.打印数组: [root@nfs-server test]# awk 'BEGIN{array[1]="zhurui";array[2]=" ...
- linux查看端口及端口详解
今天现场查看了TCP端口的占用情况,如下图 红色部分是IP,现场那边问我是不是我的程序占用了tcp的链接,,我远程登陆现场查看了一下,这种类型的tcp链接占用了400多个,,后边查了一下资料,说E ...
随机推荐
- Linux下显示运行时链接(运行时加载)
目录 介绍 如何加载动态库 dlopen() 第一个参数: 被加载动态库的路径 第二个参数: flag表示函数符号的解析方式 dlopen 返回值 dlsym() 参数: 返回值 符号优先级 dler ...
- Python Ethical Hacking - Malware Packaging(1)
PACKAGING Convert python program into an executable that: Packages all program files into a single e ...
- Python Ethical Hacking - VULNERABILITY SCANNER(5)
EXPLOITATION - XSS VULNS XSS - CROSS SITE SCRIPTING VULNS Allow an attacker to inject javascript cod ...
- Oracle版本发布规划 (文档 ID 742060.1)
Oracle Database Release Schedule of Current Database Releases (文档 ID 742060.1) Oracle Database RoadM ...
- django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.解决办法
"E:\API_Manager_PlatForm\venv\lib\site-packages\django\db\backends\mysql\base.py"在这个路径里件把b ...
- Vuex与axios的封装和调用
Vuex状态管理 状态就是数据. 在react里有个Flux的数据流管理(单向数据流) 作用1:实现组件之间的数据共享. 作用2:用于缓存.(避免当用户频繁点击,页面不断调接口) 先安装 ...
- Qt-可视化数据库操作
1 简介 参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=89 说明:Qt可使用QSqlTableModel来进行数据库的可视化操作,将mode ...
- Zabbix4.x如何安全传输数据
由于设备都在混合云,所以不少数据传输是通过公网,这样极大的增加了危险性,所以在Zabbix数据传输这块则进行PSK安全认证,由proxy主动收集agent数据后统一发送给server,这样只需要对pr ...
- docker环境部署mysql
参考文档 docker官方:https://hub.docker.com/_/mysql/?tab=description 部署步骤 1. 拉取镜像 这里我拉取了tag为5.7的镜像 docker p ...
- Zookeeper ----- ZAB算法
介绍 Zookeeper没有使用Paxos实现,而是使用ZAB(Zookeeper原子消息广播协议)作为数据一致性的核心算法. ZAB是一种专为Zookeeper设计的支持崩溃恢复的原子广播协议. Z ...