Skip to content

Instantly share code, notes, and snippets.

@vnprc
Created October 16, 2016 19:23
Show Gist options
  • Save vnprc/697f155710387bb8b1ccfb0d05502d1f to your computer and use it in GitHub Desktop.
Save vnprc/697f155710387bb8b1ccfb0d05502d1f to your computer and use it in GitHub Desktop.
Find all permutations of a string. Find all permutations without duplicates.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class StringPermutations {
public List<String> findPermutations(String input) {
List<Character> charList = new ArrayList<>(input.length());
for (int i = 0; i < input.length(); i++) {
charList.add(input.charAt(i));
}
return findPermutations(new StringBuilder(), charList);
}
public List<String> findPermutationsSkipDuplicates(String input) {
List<Character> charList = new ArrayList<>(input.length());
for (int i = 0; i < input.length(); i++) {
charList.add(input.charAt(i));
}
return findPermutationsSkipDuplicates(new StringBuilder(), charList);
}
private List<String> findPermutations(StringBuilder prefix, List<Character> remainingElements) {
List<String> results = new ArrayList<>();
if (remainingElements.size() == 0) {
return Arrays.asList(prefix.toString());
}
for (int i = 0; i < remainingElements.size(); i++) {
List<Character> newRemainingElements = new ArrayList<>(remainingElements);
Character c = newRemainingElements.remove(i);
results.addAll(findPermutations(new StringBuilder(prefix.toString()).append(c), newRemainingElements));
}
return results;
}
private List<String> findPermutationsSkipDuplicates(StringBuilder prefix, List<Character> remainingElements) {
List<String> results = new ArrayList<>();
if (remainingElements.size() == 0) {
return Arrays.asList(prefix.toString());
}
Set<Character> charsUsed = new HashSet<>();
for (int i = 0; i < remainingElements.size(); i++) {
if (charsUsed.contains(remainingElements.get(i))) {
continue;
}
List<Character> newRemainingElements = new ArrayList<>(remainingElements);
Character c = newRemainingElements.remove(i);
results.addAll(findPermutationsSkipDuplicates(new StringBuilder(prefix.toString()).append(c), newRemainingElements));
charsUsed.add(c);
}
return results;
}
public static void main(String args[]) {
StringPermutations sp = new StringPermutations();
for (String permutation : sp.findPermutations("abcdef")) {
System.out.println(permutation);
}
System.out.println("==========skip duplicates==========");
for (String permutation : sp.findPermutationsSkipDuplicates("aabbcc")) {
System.out.println(permutation);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment