https://leetcode-cn.com/problems/distinct-subsequences/
Idea: dpij dp_{ij}dpijMeans s [i:] s[i:]s[i:In the subsequence of]t [j:] t[j:]t[j:] Number of occurrences, then initiallydp [i] [m] = 1 dp[i][m]=1dp[i][m]=1,当 s [ i ] = t [ j ] s[i]=t[j] s[i]=When t [ j ] ,t [j] t[j]t [ j ] can choose whether to matchs [i] s[i]s [ i ] matches, so we getdp [i] [j] = dp [i + 1] [j + 1] + dp [i + 1] [j] dp[i][j]=dp[i+1 ][j+1]+dp[i+1][j]dp[i][j]=dp[i+1][j+1]+dp[i+1][j];否则 d p [ i ] [ j ] = d p [ i + 1 ] [ j ] dp[i][j]=dp[i+1][j] dp[i][j]=dp[i+1 ] [ j ] . To open longlong.
class Solution {
public:
int numDistinct(string s, string t) {
int n=s.size(),m=t.size();
if(n<m)
return 0;
using ll=long long;
vector<vector<ll>> dp(n+1,vector<ll>(m+1));
for(int i=0;i<=n;i++)
dp[i][m]=1;
for(int i=n-1;i>=0;i--)
{
int minj=max(0,m-(n-i));
for(int j=m-1;j>=minj;j--)
{
dp[i][j]=dp[i+1][j];
if(s[i]==t[j])
dp[i][j]+=dp[i+1][j+1];
}
}
return dp[0][0];
}
};