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
.
思路:用递归超时
DP: 建立一个matrix,matrix(i,j)表示从s.substr(0,j) 可以有多少个t.substr(0,i)的子串
<pre name="code" class="cpp">class Solution {
public:
int numDistinct(string s, string t) {
int m = s.length();
int n = t.length();
if(m*n==0) return 0;
// each position<i,j> indicates how many subsequences of t.substr(0,i) contains in s.substr(0,j)
vector<vector<int>> subseqs;
//init it to all zeros
for(int i=0; i<n; i++)
{
vector<int> row;
for(int j=0; j<m; j++)
{
row.push_back(0);
}
subseqs.push_back(row);
}
//int the first row
for(int j=0; j<m; j++)
{
if(j==0){
if(t[0]==s[j]) subseqs[0][j]=1;
continue;
}
if(t[0]!=s[j]) subseqs[0][j]=subseqs[0][j-1];
else subseqs[0][j]=subseqs[0][j-1]+1;
}
for(int i=1; i<n; i++)
{
for(int j=1; j<m; j++)
{
if(t[i]!=s[j]){
subseqs[i][j] = subseqs[i][j-1];
}
else{
// the first term is: if s[j] is not used to form the substr t.substr(0,j) from s.substr(0,i)
// the second term is s[j] is used to get the subsequence
subseqs[i][j] = subseqs[i][j-1]+subseqs[i-1][j-1];
}
}
}
return subseqs[n-1][m-1];
}
};