思路:动态规划的思路
动态规划
dp[i][j] 代表 T 前 i 字符串可以由 S的前j个字符组成的最多个数.
动态方程为:
当 S[j] == T[i] , dp[i][j] = dp[i-1][j-1] + dp[i][j-1];
当 S[j] != T[i] , dp[i][j] = dp[i][j-1]
代码如下:
class Solution {
public:
int numDistinct(string s, string t) {
int length_s=s.length();
int length_t=t.length();
long nums[length_t+1][length_s+1];
for(int i=0;i<=length_t;i++){
nums[i][0]=0;
}
for(int i=0;i<=length_s;i++){
nums[0][i]=1;
}
for(int i=0;i<length_t;i++){
for(int j=0;j<length_s;j++){
if(t[i]==s[j]) nums[i+1][j+1]=nums[i][j]+nums[i+1][j];
else nums[i+1][j+1]=nums[i+1][j];
}
}
return nums[length_t][length_s];
}
};