这道题还没有理解,等之后有空再回来看
着重理解dp数组的含义,表示的是 s 含有 t 的个数,
所以就可以理解
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
这里并没有进行 + 1 的操作,因为字符相等,但所包含的个数并不会 + 1
class Solution {
public:
int numDistinct(string s, string t) {
// 存的是 uint64_t
vector<vector<uint64_t>> dp(s.size() + 1, vector<uint64_t>(t.size() + 1));
// 初始化
for(int i = 0 ; i <= s.size(); i++)
dp[i][0] = 1; // 也就是说,当 t 为空的时候,s 可以删除掉全部元素,来组成 t
for(int j = 1; j <= t.size(); j++)
dp[0][j] = 0; // 也就是说,当 s 为空的时候,是无论如何都无法组成 t 的
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 - 1] + dp[i - 1][j]; // 有两种情况可能会满足
else
dp[i][j] = dp[i - 1][j];
}
}
return dp[s.size()][t.size()];
}
};