Here is my solution to this permutation challenge, I use the DFS Algorithm to build a permutations tree, which I prune depending on the size of the required subset.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* Permuation Application
* This class works out all permutations of a given set of elements
*
* @author arshadmayet
*
*/
public class Permutation {
public static final String EMPTY_STRING = "";
/**
* DFS Algorithm to find all permutaions on a sequence of elements
*
* @param pref path of current element in permutation tree
* @param result to store permutations
* @param sequence list of elements to permutate
* @param subset subset size, use size of sequence for the
* entire size per permutation.
* @return all permutations of the given sequence as a String List
*/
public List<String> permutate(String pref, List<String> result,
List<String> sequence, int subset) {
/*
* Get just the unvisited children for tree element
*/
List<String> diff = sequence.stream().filter(x -> !
(pref).contains(x)).collect(Collectors.toList());
/*
* No more children therefore reached end of branch store branch paths
*/
int limit = sequence.size() - subset;
if(diff.size()==limit){
result.add(pref);
}
/*
* Loop thru each child
*/
for (String s : diff) {
if(pref.length()>subset) break; // to trim permuatation tree based on
// result sequence limit
permutate(pref + s, result,sequence,subset); // recursively traverse
//tree
}
return result;
}
public static void main(String[] args) {
Permutation permutation = new Permutation();
// Test 1
String[] sequenceArray1 = { "1", "2", "3" };
List<String> sequence1 = Arrays.asList(sequenceArray1);
int subset1= sequence1.size(); //subset
List<String> results1 = permutation.permutate(EMPTY_STRING,
new ArrayList<String>(),
sequence1,
subset1);
//Display Logic
System.out.println("Test 1");
System.out.println("Sequence "+sequence1);
System.out.println("Subset "+subset1);
System.out.println(results1);
System.out.println("results size = " + results1.size());
System.out.println();
//Test 2
String[] sequenceArray2 = {"1","2","3","4"};
List<String> sequence2 = Arrays.asList(sequenceArray2);
int subset2= 2; //subset
List<String> results2 = permutation.permutate(EMPTY_STRING,
new ArrayList<String>(),
sequence2,
subset2);
//Display Logic
System.out.println("Test 2");
System.out.println("Sequence "+sequence2);
System.out.println("Subset "+subset2);
System.out.println(results2);
System.out.println("results size = " + results2.size());
}
}
Output:
Test 1
Sequence [1, 2, 3]
Subset 3
[123]
[132]
[213]
[231]
[312]
[321]
results size = 6
Test 2
Sequence [1, 2, 3, 4]
Subset 2
[12]
[13]
[14]
[21]
[23]
[24]
[31]
[32]
[34]
[41]
[42]
[43]
results size = 12