Skip to content

267. Palindrome Permutation II

Problem:

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 [].

Hint:

If a palindromic permutation exists, we just need to generate the first half of the string.

Thoughts:

public class Solution {
    public List<String> generatePalindromes(String s) {
        int[] cha = new int [256]; 
        for (int i = 0; i < s.length(); i ++) {
            cha[s.charAt(i)] += 1;
        }
        List<String> result = new LinkedList<String>();
        boolean odd = false;
        int oddIndex = 0;
        for (int i = 0; i < 256; i ++) {
            if (cha[i] % 2 == 1) {
                if (odd == true) {
                    return result;
                }
                oddIndex = i;
                odd = true;
            }
        }

        String base = "";
        if (odd == true) {
            base = (char)oddIndex + "";
            cha[oddIndex] -= 1;
        }
        process(base, cha, s.length(), result);
        return result;
    }
    private void process(String base, int[] cha, int n, List<String> result) {
        if (base.length() == n) {
            result.add(base);
            return;
        }
        for (int i = 0; i < cha.length; i ++) {
            if (cha[i] > 0) {
                cha[i] -= 2;
                process((char)i + base + (char)i, cha, n, result);
                cha[i] += 2;
            }
        }
    }
}