// 状态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]; } };