问题:Given a string S and a string T, count the number of distinct subsequences of T in S.要求出S中所有的为T的子序列。
思路:
一、直观想法:递归试探。指数级复杂度。
class Solution {
public:
int numDistinct(string S, string T) {
if(T == "")
{
if(S == "")
return 1;
else
return 0;
}
return match(S, T);
}
int match(string S, string T)
{
if(T == "")
return 1;
if(S == "")
return 0;
int count = 0;
count += match(S.substr(1), T);
if(S[0] == T[0])
count += match(S.substr(1), T.substr(1));
return count;
}
};
二、字符串神马的,最爱用动态规划,研究问题和子问题的关系。
设状态量H[i][j],表示母串S前i个字符中含有T前j个字符的子序列的个数。
初始状态H[0][0] = 1, H[i][0] = 1, H[0][j] = 0
递推关系:对于H[i][j],
如果S[i-1] != T[j-1],那么H[i][j] = H[i-1][j]
如果S[i-1] == T[j-1],那么H[i][j] = H[i-1][j] + H[i-1][j-1]
借助DP的空间缓存之后,空间复杂度变为N^2。
class Solution {
public:
int numDistinct(string S, string T) {
int m = S.length();
int n = T.length();
if(n == 0)
return 1;
if(m == 0)
return 0;
int H[m+1][n+1];
H[0][0] = 1;
for(int i=1;i<=m;i++)
H[i][0] = 1;
for(int i=1;i<=n;i++)
H[0][i] = 0;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
H[i][j] = H[i-1][j] + ((S[i-1] == T[j-1])?H[i-1][j-1]:0);
return H[m][n];
}
};