思路:
标准的DP题目,设ret(i,j)表示 s(1)...s(i) 能够形成 t(1) ... t(j)子字符串的方式数目,则:
如果s(i) == t(j) , ret(i, j) = ret(i-1,j-1) + ret(i-1, j)
否则,ret(i, j) = ret(i-1, j)
code:
class Solution {
public:
int numDistinct(string S, string T) {
int len1 = S.length(), len2 = T.length();
if(len2 > len1) return 0;
vector<int> t(len2+1,0);
vector<vector<int> > ret(len1+1,t);
for(int i = 0;i <= len1;i++)
ret[i][0] = 1;
for(int i = 1;i <= len1;i++)
for(int j = 1;j <= i && j <= len2;j++){
if(S[i-1] == T[j-1])
ret[i][j] = ret[i-1][j-1] + ret[i-1][j];
else
ret[i][j] = ret[i-1][j];
}
return ret[len1][len2];
}
};