lintcode-118-不同的子序列
118-不同的子序列
给出字符串S和字符串T,计算S的不同的子序列中T出现的个数。
子序列字符串是原始字符串通过删除一些(或零个)产生的一个新的字符串,并且对剩下的字符的相对位置没有影响。(比如,“ACE”是“ABCDE”的子序列字符串,而“AEC”不是)。样例
给出S = "rabbbit", T = "rabbit"
返回 3挑战
Do it in O(n2) time and O(n) memory.
O(n2) memory is also acceptable if you do not know how to optimize memory.标签
字符串处理 动态规划
思路
使用动态规划,首先考虑辅助空间为 O(n^2) 的情况,使用二维数组 dp[i][j] 表示 S[0...i] 中 T[0...j] 出现的个数
动态转移方程为:
dp[i][j] = dp[i-1][j-1] + dp[i-1][j] (S[i]==T[j])
dp[i][j] = dp[i-1][j] (S[i]!=T[j])
过程如下:

过程中发现,新的取值仅仅和其左上和上部元素有关,所以可以用一维数组 dp[i] 代替二维数组
code
class Solution {
public:
/**
* @param S, T: Two string.
* @return: Count the number of distinct subsequences
*/
int numDistinct(string &S, string &T) {
// write your code here
int sizeS = S.size(), sizeT = T.size(), i = 0, j = 0;
if(sizeS <= 0 || sizeT <= 0) {
return 1;
}
vector<int> dp(sizeT+1, 0);
dp[0] = 1;
for(i=1; i<=sizeS; i++) {
for(j=sizeT; j>0; j--) {
if(S[i-1] == T[j-1]) {
dp[j] += dp[j-1];
}
}
}
return dp[sizeT];
}
};
lintcode-118-不同的子序列的更多相关文章
- lintcode:最长公共子序列
题目 最长公共子序列 给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度. 样例 给出"ABCD" 和 "EDCA",这个LCS是 "A& ...
- lintcode:最长上升子序列
题目 最长上升子序列 给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度. 样例 给出[5,4,1,2,3],这个LIS是[1,2,3],返回 3 给出[4,2,4,5,3,7],这个L ...
- lintcode 最长上升连续子序列 II(二维最长上升连续序列)
题目链接:http://www.lintcode.com/zh-cn/problem/longest-increasing-continuous-subsequence-ii/ 最长上升连续子序列 I ...
- C++版 - Lintcode 77-Longest Common Subsequence最长公共子序列(LCS) - 题解
版权声明:本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C++版 - L ...
- LintCode 77: 最长公共子序列
public class Solution { /** * @param A, B: Two string. * @return: the length of the longest common s ...
- [LintCode] Longest Increasing Subsequence 最长递增子序列
Given a sequence of integers, find the longest increasing subsequence (LIS). You code should return ...
- [LintCode] Longest Increasing Continuous Subsequence 最长连续递增子序列
Give an integer array,find the longest increasing continuous subsequence in this array. An increasin ...
- lintcode 中等题 :Maximum Product Subarray 最大连续乘积子序列
题目 乘积最大子序列 找出一个序列中乘积最大的连续子序列(至少包含一个数). 样例 比如, 序列 [2,3,-2,4] 中乘积最大的子序列为 [2,3] ,其乘积为6. 解题 法一:直接暴力求解 时 ...
- lintcode :最长上升连续子序列
题目: 最长上升连续子序列 给定一个整数数组(下标从 0 到 n-1, n 表示整个数组的规模),请找出该数组中的最长上升连续子序列.(最长上升连续子序列可以定义为从右到左或从左到右的序列.) 样例 ...
- lintcode 77.Longest Common Subsequence(最长公共子序列)、79. Longest Common Substring(最长公共子串)
Longest Common Subsequence最长公共子序列: 每个dp位置表示的是第i.j个字母的最长公共子序列 class Solution { public: int findLength ...
随机推荐
- python中and,or
在很多逻辑语句中,常常会出现and,or这两个逻辑运算符. 下面直接上代码 print(0 or None) #None ''' or比较运算符: 当or旁两边都是真的话,那么会取第一个值 当or两边 ...
- java程序员所必须掌握的内容
以下内容有待细化,并用于考察员工的水平! 从低的往高级的说. 初级 1.掌握java语法 oop+io+网络 2.基本的数据结构 3.基本的算法-例如排序,合并 4.基本的几个javaee框架 spr ...
- Mysql连接报2003-10061以及1045错误
Mysql连接不上报的异常,调了好几个小时,分享一下 2003-10061错误这种情况就是没有启动,我是重装系统后出现,我安装的Mysql下并没有my.ini配置 windows下也是没有,服务管理上 ...
- Percona XtraDB Cluster 5.7安装配置
优点:1.准同步复制2.多个可同时读写节点,可实现写扩展,较分片方案更进一步3.自动节点管理4.数据严格一致5.服务高可用缺点:1.只支持innodb引擎2.所有表都要有主键3.所有的写操作都将发生在 ...
- tomcat6添加服务
Mysql在导入大量数据的时候就要把tomcat添加成服务 添加服务 在DOS界面下,进入Tomcat解压目录的bin目录 service.bat install
- Centos防火墙的配置
Selinux的三种模式:enforcing,passive,disable 临时更改模式:setengorce 1|0 1:enforcing, 0:passive [root@C ...
- 解决 Android sdk content loader 0%
第一次遇到这种情况,真的很头痛,没办法 ,是问题就要解决,在网上找了一些方法,归纳了下来. 方法一(关闭后重启): 遇到Eclipse右下角一直显示“Android sdk content loade ...
- 揭开js之constructor属性的神秘面纱
揭开 constructor 在 Javascript 语言中,constructor 属性是专门为 function 而设计的,它存在于每一个 function 的prototype 属性中.这个 ...
- Docker(三):部署软件
Docker的镜像文件可以在镜像仓库中进行搜索. 部署软件目录导航: 常用命令 部署 Tomcat 部署 MySQL 部署 Oracle 常用命令 docker的常用命令如下: docker -v , ...
- Mysql导出表结构和数据
导出数据库 -- 导出dbname表结构 mysqldump -uroot -p123456 -d dbname > dbname.sql -- 导出dbname表数据 mysqldump -u ...