package com.thealgorithms.backtracking; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.TreeSet; /** * Finds all permutations of given array * @author Alan Piao (git-Alan Piao) */ public final class Combination { private Combination() { } private static int length; /** * Find all combinations of given array using backtracking * @param arr the array. * @param n length of combination * @param the type of elements in the array. * @return a list of all combinations of length n. If n == 0, return null. */ public static List> combination(T[] arr, int n) { if (n == 0) { return null; } length = n; T[] array = arr.clone(); Arrays.sort(array); List> result = new LinkedList<>(); backtracking(array, 0, new TreeSet(), result); return result; } /** * Backtrack all possible combinations of a given array * @param arr the array. * @param index the starting index. * @param currSet set that tracks current combination * @param result the list contains all combination. * @param the type of elements in the array. */ private static void backtracking(T[] arr, int index, TreeSet currSet, List> result) { if (index + length - currSet.size() > arr.length) return; if (length - 1 == currSet.size()) { for (int i = index; i < arr.length; i++) { currSet.add(arr[i]); result.add((TreeSet) currSet.clone()); currSet.remove(arr[i]); } } for (int i = index; i < arr.length; i++) { currSet.add(arr[i]); backtracking(arr, i + 1, currSet, result); currSet.remove(arr[i]); } } }