// 状态F[i,j]:S的前i个字符的子序列 与 T的前j个字符相等 的不同子序列数
// 转移方程:F[i,j]=?这里要进行一个判断:
//          如果S[i-1]==T[j-1],则S的第i个字符可以使用,但我们可以选择是否使用
//          1.使用:F(i,j)=F(i-1,j-1)
//          2.不使用:F(i,j)=F(i-1,j)
//          即F(i,j)=F(i-1,j)+F(i-1,j-1)
//          如果S[i]!=T[j],则S的第i个字符不可以使用
//          F(i,j)=F(i-1,j)
// 初始值:F(i,0)=1; F(0,j)=0(j>=1)
// 返回结果:F(s.size(),t.size())
class Solution {
public:
    /**
     * 
     * @param S string字符串 
     * @param T string字符串 
     * @return int整型
     */
    int numDistinct(string S, string T) {
        if(S.size()<T.size())
            return 0;
        if(T.empty())
            return 1;
        int row=S.size();
        int col=T.size();
        vector<vector<int> > ret(row+1,vector<int>(col+1,0));
        for(int i=0;i<=row;i++)
        {
            ret[i][0]=1;
        }
        for(int i=1;i<=row;i++)
        {
            for(int j=1;j<=col;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[row][col];
    }
};