Given a string s
, return all the palindromic permutations (without duplicates) of it. Return an empty list if no palindromic permutation could be form.
For example:
Given s = "aabb"
, return ["abba", "baab"]
.
Given s = "abc"
, return []
.
public class Solution {
public List<String> generatePalindromes(String s) {
List<String> res = new ArrayList<String>();
int[] map = new int[256];
for (char ch: s.toCharArray()) {
map[ch] ++;
}
int count = 0;
int j = 0;
StringBuilder builder = new StringBuilder();
for (int i = 0; i < 256; i ++) {
if (count == 0 && map[i] % 2 == 1) {
j = i;
count ++;
} else if (map[i] % 2 == 1) {
return res;
}
}
if (j != 0) {
map[j] --;
builder.append((char)j);
}
helper(res, builder, map, s.length());
return res;
}
private void helper(List<String> list, StringBuilder builder, int[] map, int len) {
if (builder.length() == len) {
list.add(builder.toString());
}
for (int i = 0; i < map.length; i ++) {
if (map[i] <= 0) {
continue;
}
map[i] -= 2;
char temp = (char)i;
builder.insert(0, temp).append(temp);
helper(list, builder, map, len);
builder.deleteCharAt(0);
builder.deleteCharAt(builder.length() - 1);
map[i] += 2;
}
}
}