不同的子序列
来源:互联网 发布:还珠之我是知画 编辑:程序博客网 时间:2024/05/19 00:09
可以用动态规划来解决。
dp[i][j] 表示S中前i个到T中前j个有多少种解法。我们考虑新来了一个元素在i中,如果
S[i] != T[j]则应该删除它才有可能成功,所以此时
如果S[i] == T[i][j]则可以考虑删或者不删,删了的话则有和上一样的公式,如果不删则是固定S的i和S的j这种考虑,所以为dp[i-1][j-1]。所以有:
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 vector<vector<int>> dp(S.length()+1,vector<int>(T.length()+1)); for(int i = 0; i < S.length()+1; ++i){ dp[i][0] = 1; } for(int i = 1; i < T.length()+1; ++i){ dp[0][i] = 0; } for(int i = 1; i < S.length()+1; ++i){ for(int j = 1; j < T.length()+1; ++j){ dp[i][j] = dp[i-1][j]; if(S[i-1]==T[j-1]) { dp[i][j] += dp[i-1][j-1]; } } } return dp[S.length()][T.length()]; }};
注意由于我们加入了空集这样的边界条件(这样其实很棒~如下图),所以遍历从下标 1 开始,所以判断的时候是s[i-1] T[j-1]。
有注意到状态j只和状态j-1有关系,可以用滚动数组~改成:
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 vector<int> res(T.size()+1,0); res[0] = 1; for(int i = 1; i < S.size()+1; ++i){ int pre = 1; for(int j = 1; j < T.size()+1; ++j){ int temp = res[j]; if(S[i-1] == T[j-1]) res[j] += pre; pre = temp; } } return res[T.size()]; }};
阅读全文
0 0
- 不同的子序列
- 不同的子序列
- 不同的子序列
- 不同的子序列
- LintCode-不同的子序列
- 题目:不同的子序列
- LintCode -- 不同的子序列
- LintCode 不同的子序列
- 不同的子序列-LintCode
- lintcode--不同的子序列
- Distinct Subsequences 不同的子序列个数
- Distinct Subsequences 不同子序列
- UVa Problem 10069 Distinct Subsequences (不同的子序列)
- LeetCode: Distinct Subsequences(不同子序列的个数)
- 最大子序列的不同时间复杂度算法
- LeetCode | Distinct Subsequences(不同的子序列)
- 不同的子序列(leetcode hard)动态规划
- 118.Distinct Subsequences-不同的子序列(中等题)
- Base64编码原理分析
- 2017年7月6日 22:04:42 学习redis lists
- android sensor 框架分析---客户端
- 循环取值0、1
- 求两个正整数的最大公约数 使用c++ class编写
- 不同的子序列
- VS2015动态库编程之Win32动态库的使用(中)
- linux yum命令简要记录
- 支持post,get请求(http,https)的HttpClientUtils
- Android 体系结构
- 步科触摸屏编程
- C++图的操作
- 一个Linux下c语言线程池的实现
- 如何在 SpringMVC Controller 上使用 Spring Data 的 Projection/投影?