Distinct Subsequences
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, "ACE"
is a subsequence of"ABCDE"
while "AEC"
is not).
Here is an example:
S = "rabbbit"
, T = "rabbit"
Return 3
.
Dynamic programming: f(x,y) is defines as the num of (S[0]~S[x])'s subsequences of (T[0]~T[y])
Then we got if(S[x]==S[y]) f(x,y)=f(x-1,y)+f(x-1,y-1) else f(x,y)=f(x-1,y)
Solution:
class Solution {
public:
int numDistinct(string S, string T) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(S.size()<T.size())
return 0;
vector<int> last;
for(int i=0;i<S.size();++i){
if(last.empty())
last.push_back(S[i]==T[0]);
else
last.push_back(last.back()+(S[i]==T[0]));
}
for(int i=1;i<T.size();++i){
vector<int> next;
next.push_back(0);
for(int j=1;j<S.size();++j){
int tmp=next.back();
if(S[j]==T[i])
tmp+=last[j-1];
next.push_back(tmp);
}
last=next;
}
return last.back();
}
};