您的位置:首页 > 产品设计 > UI/UE

[Leetcode]Distinct Subsequences

2016-01-08 10:43 369 查看
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()];
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: