package com.interview.recursion;
import java.util.*;
public class Combination {
public void combination(char input[]){
Map<Character, Integer> countMap = new TreeMap<>();
for (char ch : input) {
countMap.compute(ch, (key, val) -> {
if (val == null) {
return 1;
} else {
return val + 1;
}
});
}
char str[] = new char[countMap.size()];
int count[] = new int[countMap.size()];
int index = 0;
for (Map.Entry<Character, Integer> entry : countMap.entrySet()) {
str[index] = entry.getKey();
count[index] = entry.getValue();
index++;
}
char[] output = new char[input.length];
combination(str, count, 0, output, 0);
}
private void combination(char input[],int count[],int pos, char output[],int len){
print(output, len);
for(int i=pos; i < input.length; i++){
if (count[i] == 0) {
continue;
}
output[len] = input[i];
count[i]--;
combination(input, count, i, output, len + 1);
count[i]++;
}
}
private void print(char result[],int pos){
for(int i=0; i < pos; i++){
System.out.print(result[i] + " ");
}
System.out.println();
}
public void combinationEasy(char[] input) {
List<Character> r = new ArrayList<>();
Arrays.sort(input);
combinationEasy(input, 0, r);
}
private void combinationEasy(char[] input, int pos, List<Character> r) {
r.forEach(r1 -> System.out.print(r1 + " "));
System.out.println();
for (int i = pos; i < input.length; i++) {
if (i != pos && input[i] == input[i-1]) {
continue;
}
r.add(input[i]);
combinationEasy(input, i + 1, r);
r.remove(r.size() - 1);
}
}
public static void main(String args[]){
Combination c = new Combination();
c.combination("aabbc".toCharArray());
c.combinationEasy("aabbc".toCharArray());
}
}