第一个递归版本,会TLE,很简单,不用几行
class Solution {
public:
int numDistinct(string s, string t) {
if(s.size() < t.size() ) return 0;
if(s == t) return 1;
if(s[0] == t[0]){
return numDistinct(s.substr(1),t.substr(1)) + numDistinct(s.substr(1),t);
}
else return numDistinct(s.substr(1),t);
}
};
时间复杂度o(s.size() * t.size())
空间复杂度 o(1)
第二个版本,动态规划
时间复杂度o(mn),空间o(n)
class Solution {
public:
int numDistinct(string s, string t) {
int m = t.size();
int n = s.size();
int dp[m+1][n+1];
//善于把递归转换成动态规划
for(int i = 0; i <= m; i++){
dp[i][0] = 0;
}
for(int j = 0; j <= n; j++){
dp[0][j] = 1;
}
for(int i = 1; i <= m ; ++i){
for(int j = 1; j <= n; ++j){
dp[i][j] = dp[i][j-1] + (t[i-1] == s[j-1]? dp[i-1][j-1] : 0);
}
}
return dp[m][n];
}
};