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的遍历指针到头了,则说明成功了一次匹配

class Solution {
public:
int numDistinct(string S, string T) {
int ans = ;
if(S.size()<T.size())
return ;
if(S.size() == T.size())
if(S == T)
return ;
else
return ;
return numSubDistinct(,,S,T);
}
int numSubDistinct(int sBegin,int tBegin,string &S,string &T)
{
if(tBegin== T.size())
return ;
if(sBegin == S.size() && tBegin!= T.size())
return ;
if(S[sBegin] == T[tBegin])
return numSubDistinct(sBegin+,tBegin+,S,T) + numSubDistinct(sBegin+,tBegin,S,T);
else
return numSubDistinct(sBegin+,tBegin,S,T);
}
};

之后,考虑用递推实现。

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

建立二维数组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];

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

class Solution {
public:
int numDistinct(string S, string T) {
int ans = ;
if(S.size()<T.size())
return ;
if(S.size() == T.size())
if(S == T)
return ;
else
return ; vector<vector<int> > num;
num.resize(S.size());
for(int i = ;i<S.size();i++)
num[i].resize(T.size()); //initialize
if(S[] == T[])
num[][] = ;
else
num[][] = ;
for(int i = ;i<S.size();i++)
{
if(S[i] == T[])
num[i][] = num[i-][] + ;
else
num[i][] = num[i-][];
} for(int j = ;j<T.size();j++)
{
num[][j] = ;
} for(int sBegin = ;sBegin<S.size();sBegin++)
for(int tBegin = ;tBegin<T.size();tBegin++)
{
if(S[sBegin] == T[tBegin])
num[sBegin][tBegin] = num[sBegin-][tBegin-] + num[sBegin-][tBegin];
else
num[sBegin][tBegin] = num[sBegin-][tBegin];
} return num[S.size()-][T.size()-];
}
};

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. wusir 面试题答案在老男孩的视频里

    注意:你问答案在哪里?答案在视频里了,就是不给你写. 第一部分 Python基础篇(80题) 为什么学习Python? 通过什么途径学习的Python? Python和Java.PHP.C.C#.C+ ...

  2. MTCNN学习资源

    MTCNN pytorch版本的实现 TropComplique/mtcnn-pytorch https://github.com/TropComplique/mtcnn-pytorch MTCNN实 ...

  3. 学习Pytbon第七天,集合

    list_1=[5,22,2,6,5,66,6,8] list_1=set(list_1)#把列表转成集合,天生不允许 重复 print(list_1,type(list_1) list_2=set( ...

  4. linux的发展过程

    1. 操作系统 人与计算机硬件直接的中介 2. Linux系统组成 3. Linux的发展过程 蛋-人-人-人 unix于诞生贝尔实验室 人-谭教授 谭宁邦 minix mini unix. 主要用于 ...

  5. 【Next Permutation】cpp

    题目: Implement next permutation, which rearranges numbers into the lexicographically next greater per ...

  6. 【Remove Elements】cpp

    题目: Given an array and a value, remove all instances of that value in place and return the new lengt ...

  7. aircrack-ng破解wlan无线流量包

    记录一下新的知识点. 无线协议里最关键的就是EAPOL协议了,这个里面保存着密钥,所以破解无线流量包也应该从这里入手. 用到的工具是aircrack-ng,这个在kali自带,也可以下载windows ...

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

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

  9. [oldboy-django][2深入django]老师管理 -- form表单如何生成多选框标签,多选框的默认值显示,以及多选框数据插入到数据库,多选框数据更改到数据库

    1 form表单如何生成多选框(包含了多选框可选择内容) - Form设置班级输入框为 select多选 - 多选 class TeacherForm(Form): name = fields.Cha ...

  10. 利用js生成二维码

    $('#barcode').qrcode({ width: 300, height: 300, render: !!document.createElement('canvas').getContex ...