public int numDistinct(String S, String T) {
        int[][] memo = new int[T.length() + 1][S.length() + 1];

        for(int i = 1; i < T.length() + 1; i++){
            memo[i][0] = 0;
        }

        for(int j = 0; j < S.length() + 1; j++){
            memo[0][j] = 1;
        }

        for(int i = 1; i < T.length() + 1; i++){
            for(int j = 1; j < S.length() + 1; j++){
                memo[i][j] = memo[i][j - 1] + (T.charAt(i - 1) == S.charAt(j - 1) ? memo[i - 1][j - 1] : 0);
            }
        }
        return memo[T.length()][S.length()];
    }