LintCode 不同的子序列
来源:互联网 发布:电玩城源码 编辑:程序博客网 时间:2024/05/19 00:54
给出字符串S和字符串T,计算S的不同的子序列中T出现的个数。
子序列字符串是原始字符串通过删除一些(或零个)产生的一个新的字符串,并且对剩下的字符的相对位置没有影响。(比如,“ACE”是“ABCDE”的子序列字符串,而“AEC”不是)。
样例
给出S = "rabbbit", T = "rabbit"
返回 3
分析:
首先想到的是深度优先搜索,递归找出所有可能的情况,结果超时
然后从动态规划方面考虑
如果只匹配最后一位字符T[n],则在S中T[n]出现了几次就有几种方式
若匹配后两位则是T[n-1]在S中出现且后面有T[n]所有的情况
依次类推,可以得到答案
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 num = 0; sub(S, T, 0, 0, num); return num; } void sub(string &S, string &T, int p1, int p2, int &num) { if(p2 >= T.size()) { num += 1; return; } char t = T[p2]; for(int i = p1; i < S.size(); ++i) { if(S[i] == t) { sub(S, T, i + 1, p2 + 1, num); } } } */ int numDistinct(string &S, string &T) { // write your code here if(T.size() == 0) return 1; vector<int> buf(S.size(), 0); int pos = T.size() - 1; int num = 1; while(pos >= 0) { char t = T[pos]; for(int i = buf.size() - 1; i >= 0; --i) { if(S[i] == t) { int tmp = buf[i]; buf[i] = num; num += tmp; }else { num += buf[i]; buf[i] = 0; } } --pos; num = 0; } num = 0; for(int i = 0; i < buf.size(); ++i) { num += buf[i]; } return num; }};
0 0
- LintCode-不同的子序列
- LintCode -- 不同的子序列
- LintCode 不同的子序列
- 不同的子序列-LintCode
- lintcode--不同的子序列
- lintcode之不同子序列数 + 序列II
- 不同的子序列
- 不同的子序列
- 不同的子序列
- 不同的子序列
- LintCode 带重复元素的子序列
- 题目:不同的子序列
- LintCode-乘积最大子序列
- lintcode-最长连续子序列
- LintCode -- 乘积最大子序列
- LintCode : 最长公共子序列
- lintcode- 乘积最大子序列
- LintCode:乘积最大子序列
- 自定义UITableViewCell(registerNib: 与 registerClass: 的区别)
- es6 javascript的Reflect 对象的方法
- javaweb项目中常用知识
- Cmake的介绍和使用 Cmake实践
- python的super函数示例
- LintCode 不同的子序列
- POJ 2836 Rectangular Covering 已被翻译
- 十步完全理解 SQL
- 几种对栈操作的方法
- ubuntu server 16.04 挂载多个硬盘并设置自启挂载
- 一、数据库系统概述
- 跟我一起写 Makefile(三)
- C语言如何不用除法取出整数中的一位数?
- 5.OpenFlow表 OpenFlow1.5核心概念翻译与理解-OpenFlow1.5中文版