Given a string S and a string T, count the number of distinct subsequences ofT 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
class Solution {
public:
/*algorithm: DFS
this is brute force, select T'char from S char set, it has time limit error on OJ
*/
void dfs(string &s,string &t,string sub,int &count,int start){
if(sub.size() == t.size()){
count++;
return;
}
for(int i = start;i < s.size();i++){
if(s[i] == t[sub.size()]){
sub.append(1,s[i]);
dfs(s,t,sub,count,i+1);
sub.erase(sub.size()-1);
}
}
}
int numDistinct(string s, string t) {
if(s.size() < t.size())return 0;
int count = 0;
dfs(s,t,"",count,0);
return count;
}
};
class Solution {
public:
/*algorithm: dp
dp(i,j): denote the distinct sequences of s(0,i) to t(0,j)
transit function:
dp(i,j) = dp(i-1,j) + dp(i-1,j-1) if(s[i] == t[j])
= dp(i-1,j)
intial: dp(0,0)=1,dp(i,0)=1 dp(0,j)=0:
result: dp(s.size(),t.size())
time O(ST) space O(ST)
*/
int numDistinct(string s, string t) {
if(s.size() < t.size())return 0;
vector<vector<int> >dp(s.size()+1,vector<int>(t.size()+1,0));//dp[S+1][T+1]
dp[0][0]=1;
for(int i = 1;i <= s.size();i++){
dp[i][0]=1;
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()];
}
};