https://oj.leetcode.com/problems/distinct-subsequences/

对于string S 和 T求,T 是 S的几种子串。

首先想到了递归方法,列出递归公式,奈何超时了:

如果S[sBegin] == T[tBegin] 则是 numSubDistinct(sBegin+1,tBegin+1,S,T) + numSubDistinct(sBegin+1,tBegin,S,T);
如果不等于,则 numSubDistinct(sBegin+1,tBegin,S,T);
如果T的遍历指针到头了,则说明成功了一次匹配

  1. class Solution {
  2. public:
  3. int numDistinct(string S, string T) {
  4. int ans = ;
  5. if(S.size()<T.size())
  6. return ;
  7. if(S.size() == T.size())
  8. if(S == T)
  9. return ;
  10. else
  11. return ;
  12. return numSubDistinct(,,S,T);
  13. }
  14. int numSubDistinct(int sBegin,int tBegin,string &S,string &T)
  15. {
  16. if(tBegin== T.size())
  17. return ;
  18. if(sBegin == S.size() && tBegin!= T.size())
  19. return ;
  20. if(S[sBegin] == T[tBegin])
  21. return numSubDistinct(sBegin+,tBegin+,S,T) + numSubDistinct(sBegin+,tBegin,S,T);
  22. else
  23. return numSubDistinct(sBegin+,tBegin,S,T);
  24. }
  25. };

之后,考虑用递推实现。

根据思路来说,首先想到从后往前递推,但如果从后往前可以,则从前往后也可以。

建立二维数组num[S.size()][T.size()]存这个过程中产生的中间结果。

首先定义:num[i][j]是对于S从0到 i 的子串,对于T从 0 到 j 的子串,这两个字符串,T是S的子串数。

如果S[sBegin] == T[tBegin] num[sBegin][tBegin] = num[sBegin-1][tBegin-1] + num[sBegin-1][tBegin];

如果不等于则 num[sBegin][tBegin] = num[sBegin-1][tBegin];

根据公式,考虑到进行两层循环,
但是循环之前需要初始化

  1. class Solution {
  2. public:
  3. int numDistinct(string S, string T) {
  4. int ans = ;
  5. if(S.size()<T.size())
  6. return ;
  7. if(S.size() == T.size())
  8. if(S == T)
  9. return ;
  10. else
  11. return ;
  12.  
  13. vector<vector<int> > num;
  14. num.resize(S.size());
  15. for(int i = ;i<S.size();i++)
  16. num[i].resize(T.size());
  17.  
  18. //initialize
  19. if(S[] == T[])
  20. num[][] = ;
  21. else
  22. num[][] = ;
  23. for(int i = ;i<S.size();i++)
  24. {
  25. if(S[i] == T[])
  26. num[i][] = num[i-][] + ;
  27. else
  28. num[i][] = num[i-][];
  29. }
  30.  
  31. for(int j = ;j<T.size();j++)
  32. {
  33. num[][j] = ;
  34. }
  35.  
  36. for(int sBegin = ;sBegin<S.size();sBegin++)
  37. for(int tBegin = ;tBegin<T.size();tBegin++)
  38. {
  39. if(S[sBegin] == T[tBegin])
  40. num[sBegin][tBegin] = num[sBegin-][tBegin-] + num[sBegin-][tBegin];
  41. else
  42. num[sBegin][tBegin] = num[sBegin-][tBegin];
  43. }
  44.  
  45. return num[S.size()-][T.size()-];
  46. }
  47. };

LeetCode OJ-- Distinct Subsequences ** 递推的更多相关文章

  1. [LeetCode OJ] Distinct Subsequences

    Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...

  2. [LeetCode] 115. Distinct Subsequences 不同的子序列

    Given a string S and a string T, count the number of distinct subsequences of S which equals T. A su ...

  3. Java for LeetCode 115 Distinct Subsequences【HARD】

    Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...

  4. [Leetcode][JAVA] Distinct Subsequences

    Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...

  5. 【leetcode】Distinct Subsequences(hard)

    Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...

  6. leetcode 115 Distinct Subsequences ----- java

    Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...

  7. LeetCode 70 - 爬楼梯 - [递推+滚动优化]

    假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2输出: 2解释: 有两种方 ...

  8. [leetcode]115. Distinct Subsequences 计算不同子序列个数

    Given a string S and a string T, count the number of distinct subsequences of S which equals T. A su ...

  9. 九度OJ 1081:递推数列 (递归,二分法)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6194 解决:864 题目描述: 给定a0,a1,以及an=p*a(n-1) + q*a(n-2)中的p,q.这里n >= 2. 求第 ...

随机推荐

  1. Python知识点入门笔记——特色数据类型(元组)

    元组(tuple)是Python的另一种特色数据类型,元组和列表是相似的,可以存储不同类型的数据,但是元组是不可改变的,创建后就不能做任何修改操作. 创建元组 用逗号隔开的就是元组,但是为了美观和代码 ...

  2. Java中BigInteger类型

    BigInteger是java.math包提供的处理大整数类型,实现了大整数的存储,四则运算,判断素数的方法,求幂,求模,求逆元,求最大公约数等方法.本文主要分析下BigInteger对于大整数的存储 ...

  3. loj2071 「JSOI2016」最佳团体

    分数规划+树形依赖背包orz #include <iostream> #include <cstring> #include <cstdio> #include & ...

  4. 我给女朋友讲编程CSS系列(1) –添加CSS样式的3种方式及样式表的优先权

    如果说,原生态就是美,那么,我们就没有必要穿衣打扮. 网页是什么? 说白了,网页就是一堆[html标签]有序的搭配,让[CSS属性值]整整容,请[Javascript语言]处理一下事件. 一个人的整容 ...

  5. 我给女朋讲编程网络系列(2)--IIS8 如何在本地发布网站

    通过IIS8 在本地发布网站,一个截图,你就全明白了,越是简单,越是实用. 如果有现成的网站,就将你的网站放到一个文件夹中,比如WebTest2中. 如何没有网站,可以在WebTest2中新建一个in ...

  6. C 语言 习题 1-14

    练习 1-14 编写一个程序,打印输入中各个字符出现频度的直方图. #include <stdio.h> /* count digits, white space, others */ i ...

  7. 【Luogu P1661】扩散

    题目: 一个点每过一个单位时间就会向四个方向扩散一个距离,如图. 两个点$a$.$b$连通,记作$e(a,b)$,当且仅当$a$.$b$的扩散区域有公共部分.连通块的定义是块内的任意两个点$u$.$v ...

  8. IOS开发学习笔记015-block和protocol

    一.block block 代码段    标识是 ^    block 和函数很像 1.可以保存代码 2.有返回值 3.有形参 格式 返回值 (block名)(形参列表) = ^(形参列表) {代码段 ...

  9. IOS开发学习笔记007-数据结构

    目录: 1.全局变量和局部变量 2.结构体 3.结构体数组 4.结构体做函数参数 5.结构体指针 6.枚举 7.总结 一.全局变量和局部变量 全局变量和局部变量的区别 1. 全局变量,再函数外定义的变 ...

  10. Python+Selenium练习篇之15-在浏览器中新开一个tab

    本文介绍如selenium方法打开一个新的tab,我们知道在浏览器里,我们按住 ctrl+ t 就可以新打开一个tab.所以我们学习如何利用webdriver中send_key 的方法去触发ctrl+ ...