2023.8.25
使用dp数组解决。 定义一个二维dp数组,dp[i][j]的含义为:字符串s(下标为i-1)中,子序列t(下标为j-1)出现的个数。
当字符串s[i-1]和t[j-1]相同时,递推公式为:dp[i][j] = dp[i-1][j-1] + dp[i][j-1]; 不相同时,dp[i][j] = dp[i][j-1];
初始化需要将第一行全初始化为1。 下面看代码:
class Solution {
public:
int numDistinct(string s, string t) {
vector<vector<uint64_t>> dp(t.size()+1,vector<uint64_t>(s.size()+1,0));
//初始化第一行
for(int i=0; i<=s.size(); i++) dp[0][i] = 1;
for(int i=1; i<=t.size(); i++)
{
for(int j=1; j<=s.size(); j++)
{
if(t[i-1] == s[j-1]) dp[i][j] = dp[i-1][j-1] + dp[i][j-1];
else dp[i][j] = dp[i][j-1];
}
}
return dp[t.size()][s.size()];
}
};