115. Distinct Subsequences dp算法
2016-05-14 20:16
441 查看
Given a string S and a string T, count the number of distinct subsequences of
T in S.
A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie,
Here is an example:
S =
Return
Subscribe to see which companies asked this question
分析:
此题可以换一个说法,删除s中的元素变成T,有几种不同的删除方法,即可以产生多少种子序列。
定义二维数组dp[i][j]为字符串s(0,i)变换到t(0,j)的变换方法。
如果S[i]==T[j],那么dp[i][j] = dp[i-1][j-1] + dp[i-1][j]。意思是:如果当前S[i]==T[j],那么当前这个字母即可以保留也可以抛弃,所以变换方法等于保留这个字母的变换方法加上不用这个字母的变换方法。dp[i-1][j-1]是保留,dp[i-1][j]是抛弃。
如果S[i]!=T[j],那么dp[i][j] = dp[i-1][j],意思是如果当前字符不等,那么就只能抛弃当前这个字符。
dp[i][0]=1
代码:
class Solution {
public:
int numDistinct(string s, string t) {
if(s.size()==0||t.size()==0||s.size()<t.size()) return 0;
vector<vector<int>> dp(s.size()+1,vector<int>(t.size()+1,0));
for(int i=0;i<s.size();++i) dp[i][0]=1;
for(int i=1;i<=s.size();++i)
for(int j=1;j<=t.size();++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.size()][t.size()];
}
};
T in S.
A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie,
"ACE"is a subsequence of
"ABCDE"while
"AEC"is not).
Here is an example:
S =
"rabbbit", T =
"rabbit"
Return
3.
Subscribe to see which companies asked this question
分析:
此题可以换一个说法,删除s中的元素变成T,有几种不同的删除方法,即可以产生多少种子序列。
定义二维数组dp[i][j]为字符串s(0,i)变换到t(0,j)的变换方法。
如果S[i]==T[j],那么dp[i][j] = dp[i-1][j-1] + dp[i-1][j]。意思是:如果当前S[i]==T[j],那么当前这个字母即可以保留也可以抛弃,所以变换方法等于保留这个字母的变换方法加上不用这个字母的变换方法。dp[i-1][j-1]是保留,dp[i-1][j]是抛弃。
如果S[i]!=T[j],那么dp[i][j] = dp[i-1][j],意思是如果当前字符不等,那么就只能抛弃当前这个字符。
dp[i][0]=1
代码:
class Solution {
public:
int numDistinct(string s, string t) {
if(s.size()==0||t.size()==0||s.size()<t.size()) return 0;
vector<vector<int>> dp(s.size()+1,vector<int>(t.size()+1,0));
for(int i=0;i<s.size();++i) dp[i][0]=1;
for(int i=1;i<=s.size();++i)
for(int j=1;j<=t.size();++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.size()][t.size()];
}
};
相关文章推荐
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法
- C#使用动态规划解决0-1背包问题实例分析
- 动态规划
- C++ 动态规划
- DP(动态规划) 解游轮费用问题
- 动态规划的用法——01背包问题
- 动态规划的用法——01背包问题
- 《收集苹果》 动态规划入门
- 《DNA比对》蓝桥杯复赛试题
- 《背包问题》 动态规划
- 自顶向下动态规划解决最长公共子序列(LCS)问题
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 关于爬楼梯的动态规划算法
- 动态规划 --- hdu 1003 **
- DP问题各种模型的状态转移方程
- 0-1背包解题过程
- 背包问题
- USACO 3.2.2:Stringsobits
- 字符串编辑距离