public static List<String> topDown (List<Character> s) {
		// trivial case
		if ( s.size() == 2 ) {
			String  s1  =  new String(new char[]{s.get(0), s.get(1)});
			String  s2  =  new String(new char[]{s.get(1), s.get(0)});
			ArrayList<String>  al  =  new ArrayList<>();
			al.add(s1);
			al.add(s2);
			return  al;
		}
		List<String>	ret  =  new ArrayList<>();		
		for ( Character c : s ) {
			List<Character>  dup  =  new ArrayList<>(s);
			dup.remove(c);
			List<String>	l = topDown( dup );
			for ( String str : l) {
				ret.add( str + c );
			}
		}
		return ret;
	}