class Solution:
def numDistinct(self, s: str, t: str) -> int:
if len(t) > len(s):
return 0
dp = {}
def dfs(i, j):
if j == len(t):
return 1
if i == len(s):
return 0
if (i, j) in dp:
return dp[(i, j)]
res = dfs(i + 1, j)
if s[i] == t[j]:
res += dfs(i + 1, j + 1)
dp[(i, j)] = res
return res
return dfs(0, 0)
public class Solution {
private int[][] dp;
public int numDistinct(String s, String t) {
int m = s.length(), n = t.length();
if (n > m) return 0;
dp = new int[m + 1][n + 1];
for (int i = 0; i <= m; i++) {
Arrays.fill(dp[i], -1);
}
return dfs(s, t, 0, 0);
}
private int dfs(String s, String t, int i, int j) {
if (j == t.length()) return 1;
if (i == s.length()) return 0;
if (dp[i][j] != -1) return dp[i][j];
int res = dfs(s, t, i + 1, j);
if (s.charAt(i) == t.charAt(j)) {
res += dfs(s, t, i + 1, j + 1);
}
dp[i][j] = res;
return res;
}
}
class Solution {
vector> dp;
public:
int numDistinct(string s, string t) {
int m = s.size(), n = t.size();
if (n > m) return 0;
dp.assign(m + 1, vector(n + 1, -1));
return dfs(s, t, 0, 0);
}
private:
int dfs(const string &s, const string &t, int i, int j) {
if (j == t.size()) return 1;
if (i == s.size()) return 0;
if (dp[i][j] != -1) return dp[i][j];
int res = dfs(s, t, i + 1, j);
if (s[i] == t[j]) {
res += dfs(s, t, i + 1, j + 1);
}
dp[i][j] = res;
return res;
}
};
class Solution {
/**
* @param {string} s
* @param {string} t
* @return {number}
*/
numDistinct(s, t) {
let m = s.length, n = t.length;
if (n > m) return 0;
let dp = Array(m + 1).fill().map(() =>
Array(n + 1).fill(-1));
const dfs = (i, j) => {
if (j === n) return 1;
if (i === m) return 0;
if (dp[i][j] !== -1) return dp[i][j];
let res = dfs(i + 1, j);
if (s[i] === t[j]) {
res += dfs(i + 1, j + 1);
}
dp[i][j] = res;
return res;
}
return dfs(0, 0);
}
}