class Solution {
public:
int numDistinct(string s, string t) {
vector> dp(s.size()+1,vector(t.size()+1));
//为什么要这样初始化:
//dp[i][0] 表示:以i-1为结尾的s可以随便删除元素,出现空字符串的个数。
//那么dp[i][0]一定都是1,因为也就是把以i-1为结尾的s,删除所有元素,出现空字符串的个数就是1。
for (int i = 0; i <= s.size(); i++) dp[i][0] = 1;
for(int i=1;i<=s.size();i++)
{
for(int j=1;j<=t.size();j++)
{
if(s[i-1]==t[j-1])
{
dp[i][j]=(dp[i-1][j]+dp[i-1][j-1])%INT_MAX;
}
//为什么这样推:
//当最后一位相等时,以s = "rara" t = "ra" 为例,当i = 4, j = 2时,s[i] == t[j]。
//此时分为2种情况,s串用最后一位的a + 不用最后一位的a。
//如果用s串最后一位的a,那么t串最后一位的a也被消耗掉,此时的子序列其实=dp[i-1][j-1]
//如果不用s串最后一位的a,那就得看"rar"里面是否有"ra"子序列的了,就是dp[i-1][j]
//再看s[i] != t[j] 比如 s = "rarb" t = "ra" 还是当i = 3, j = 1时,s[i] != t[j]
//此时显然最后的b想用也用不上啊。所以只能指望前面的"rar"里面是否有能匹配"ra"的
//所以此时dp[i][j] = dp[i-1][j]
else
{
dp[i][j]=(dp[i-1][j])%INT_MAX;
}
//不能返回最大值,比如s=eee;j=eee;
//此时返回值为1,而不是最大值3;
}
}
return dp[s.size()][t.size()];
}
};