package problems.medium; import java.util.*; import java.util.stream.Collectors; /** * Created by sherxon on 1/24/17. */ public class SubsetsII { public static void main(String[] args) { new SubsetsII().subsetsWithDup(new int[]{4, 4, 4, 1, 4}); } public List<List<Integer>> subsetsWithDup(int[] nums) { List<List<Integer>> list = new ArrayList<>(); if (nums.length == 0) return list; Arrays.sort(nums); Set<String> set = new HashSet<>(); boolean[] b = new boolean[nums.length]; find(nums, b, -1, list, set); System.out.println(list); return list; } void find(int[] a, boolean[] b, int n, List<List<Integer>> list, Set<String> set) { if (n == a.length - 1) { List<Integer> l = new ArrayList<>(); for (int i = 0; i < b.length; i++) if (b[i]) l.add(a[i]); StringBuilder sb = new StringBuilder(l.stream().map(String::valueOf).collect(Collectors.joining(","))); if (set.add(sb.toString())) { System.out.println(sb); list.add(l); set.add(sb.reverse().toString()); } } else { b[n + 1] = true; find(a, b, n + 1, list, set); b[n + 1] = false; find(a, b, n + 1, list, set); } } }