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 {
private List<String> list = new ArrayList<String>();
public List<String> generatePalindromes(String s) {
//判断一个string能否组成panlindrome, LC 266
int numOdds = 0;
int[] map = new int[256];
for(char c : s.toCharArray()){
map[c]++;
// 一个char第一次出现numOdds增加一,第二次出现numOdds减少一。
// 出现偶数次的char最终对numOdds被抵消。
// 出现基数词的char则会让numOdss加一。
numOdds = (map[c]&1) == 1 ? numOdds+1 : numOdds - 1;
}
if(numOdds > 1) return list;
//类似于409 Longest Palindrome, 奇数个的那个char单独考虑,必须放中间。
//这里palindrome本身是对称的,所以只需要找到一半的全排列,利用对称就能得到完整的string.
String mid = "";
int halfLen = 0;
for(int i=0; i<256; i++){
if(map[i] == 0) continue;
// 找到那个出现奇数次的字符。
if((map[i]&1) == 1){
mid = "" + (char)i;
map[i]--;
}
// 得到各个字符一半数量的长度
map[i] = map[i]/2;
halfLen += map[i];
}
// 数字的permutation.
generatePalindromes("", map, halfLen, mid);
return list;
}
public void generatePalindromes(String half, int[] map, int halfLen, String mid){
// 终止条件,利用palindrome的对称性输出结果。
if(half.length() == halfLen){
StringBuilder reverse= new StringBuilder(half).reverse();
list.add(half + mid + reverse);
return;
}
for(int i=0; i<256; i++){
if(map[i] > 0){
map[i]--;
generatePalindromes(half+(char)i, map, halfLen, mid);
map[i]++;
}
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。