LeetCode OJ-- Distinct Subsequences ** 递推
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 ** 递推的更多相关文章
- [LeetCode OJ] Distinct Subsequences
Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...
- [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 ...
- 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 ...
- [Leetcode][JAVA] Distinct Subsequences
Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...
- 【leetcode】Distinct Subsequences(hard)
Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...
- 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 ...
- LeetCode 70 - 爬楼梯 - [递推+滚动优化]
假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2输出: 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 ...
- 九度OJ 1081:递推数列 (递归,二分法)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6194 解决:864 题目描述: 给定a0,a1,以及an=p*a(n-1) + q*a(n-2)中的p,q.这里n >= 2. 求第 ...
随机推荐
- Python知识点入门笔记——特色数据类型(元组)
元组(tuple)是Python的另一种特色数据类型,元组和列表是相似的,可以存储不同类型的数据,但是元组是不可改变的,创建后就不能做任何修改操作. 创建元组 用逗号隔开的就是元组,但是为了美观和代码 ...
- Java中BigInteger类型
BigInteger是java.math包提供的处理大整数类型,实现了大整数的存储,四则运算,判断素数的方法,求幂,求模,求逆元,求最大公约数等方法.本文主要分析下BigInteger对于大整数的存储 ...
- loj2071 「JSOI2016」最佳团体
分数规划+树形依赖背包orz #include <iostream> #include <cstring> #include <cstdio> #include & ...
- 我给女朋友讲编程CSS系列(1) –添加CSS样式的3种方式及样式表的优先权
如果说,原生态就是美,那么,我们就没有必要穿衣打扮. 网页是什么? 说白了,网页就是一堆[html标签]有序的搭配,让[CSS属性值]整整容,请[Javascript语言]处理一下事件. 一个人的整容 ...
- 我给女朋讲编程网络系列(2)--IIS8 如何在本地发布网站
通过IIS8 在本地发布网站,一个截图,你就全明白了,越是简单,越是实用. 如果有现成的网站,就将你的网站放到一个文件夹中,比如WebTest2中. 如何没有网站,可以在WebTest2中新建一个in ...
- C 语言 习题 1-14
练习 1-14 编写一个程序,打印输入中各个字符出现频度的直方图. #include <stdio.h> /* count digits, white space, others */ i ...
- 【Luogu P1661】扩散
题目: 一个点每过一个单位时间就会向四个方向扩散一个距离,如图. 两个点$a$.$b$连通,记作$e(a,b)$,当且仅当$a$.$b$的扩散区域有公共部分.连通块的定义是块内的任意两个点$u$.$v ...
- IOS开发学习笔记015-block和protocol
一.block block 代码段 标识是 ^ block 和函数很像 1.可以保存代码 2.有返回值 3.有形参 格式 返回值 (block名)(形参列表) = ^(形参列表) {代码段 ...
- IOS开发学习笔记007-数据结构
目录: 1.全局变量和局部变量 2.结构体 3.结构体数组 4.结构体做函数参数 5.结构体指针 6.枚举 7.总结 一.全局变量和局部变量 全局变量和局部变量的区别 1. 全局变量,再函数外定义的变 ...
- Python+Selenium练习篇之15-在浏览器中新开一个tab
本文介绍如selenium方法打开一个新的tab,我们知道在浏览器里,我们按住 ctrl+ t 就可以新打开一个tab.所以我们学习如何利用webdriver中send_key 的方法去触发ctrl+ ...