package problems.medium;
import java.util.*;
/**
* Created by sherxon on 4/28/17.
*/
public class PalindromPermuatation2 {
public static void main(String[] args) {
System.out.println(new PalindromPermuatation2().generatePalindromes("abc"));
}
public List<String> generatePalindromes(String s) {
List<String> list= new ArrayList<>();
if(s.length() == 0) return list;
char[] a=s.toCharArray();
String res=isPalin(a);
if(res.length()==0)return list;
Set<String> set= new HashSet<>();
char[] b=res.substring(0, res.length()-1).toCharArray();
perm(b, 0, set);
for (String s1 : set) {
StringBuilder sb= new StringBuilder(s1);
if(s.length()%2==0)
list.add(s1+sb.reverse().toString());
else
list.add(s1+res.charAt(res.length()-1) + sb.reverse().toString());
}
return list;
}
void perm(char[] a, int k, Set<String> set){
if(k==a.length){
set.add(new String(a));
return;
}
for(int i=k; i<a.length; i++){
if(i!=k && a[i]==a[k])continue;
swap(a, i, k);
perm(a, k + 1, set);
swap(a, i, k);
}
}
void swap(char[] a, int i, int j){
char temp=a[i];
a[i]=a[j];
a[j]=temp;
}
String isPalin(char[] a){
Map<Character, Integer> map=new HashMap<>();
for(int i=0; i<a.length; i++){
if(!map.containsKey(a[i]))
map.put(a[i], 1);
else
map.put(a[i], map.get(a[i]) + 1);
}
StringBuilder sb= new StringBuilder();
int odds=0;
char odd='0';
for (Character character : map.keySet()) {
if(map.get(character)%2!=0){
odds++;
odd=character;
}
for (int i = 0; i < map.get(character)/2; i++) {
sb.append(character);
}
}
return odds>1 ? "" : sb.append(odd).toString();
}
}