# 0267. Palindrome Permutation II
###### tags: `Leetcode` `FaceBook` `Backtracking` `Medium`
Link: https://leetcode.com/problems/palindrome-permutation-ii/
## 思路
首先记录每个元素出现的次数,如果出现奇数次的元素个数大于1,说明不可能形成palindrome,直接return 空list
否则用char[]记录所有出现次数为偶数的character 再用单个char(ch)记录出现次数为奇数的character,然后用backtracking排列char[] 里面的元素,假设排出来的字符串叫str,那么最后的答案就加上str+ch+str.reverse()
由于这题也是固定长度的排列,所以和 [0046. Permutation](https://hackmd.io/-8eJWSdqSayMA47GdqKphg)一样用交换
这题需要用set存,跟46不一样,因为46题array里面不会有重复的字符
## Code
```java=
public class Solution {
List < String > set = new ArrayList < > ();
public List < String > generatePalindromes(String s) {
int[] map = new int[128];
char[] st = new char[s.length() / 2];
if (!canPermutePalindrome(s, map))
return new ArrayList < > ();
char ch = 0;
int k = 0;
for (int i = 0; i < map.length; i++) {
if (map[i] % 2 == 1)
ch = (char) i;
for (int j = 0; j < map[i] / 2; j++) {
st[k++] = (char) i;
}
}
permute(st, 0, ch);
return new ArrayList < String > (set);
}
public boolean canPermutePalindrome(String s, int[] map) {
int count = 0;
for (int i = 0; i < s.length(); i++) {
map[s.charAt(i)]++;
if (map[s.charAt(i)] % 2 == 0)
count--;
else
count++;
}
return count <= 1;
}
public void swap(char[] s, int i, int j) {
char temp = s[i];
s[i] = s[j];
s[j] = temp;
}
void permute(char[] s, int l, char ch) {
if (l == s.length) {
set.add(new String(s) + (ch == 0 ? "" : ch) + new StringBuffer(new String(s)).reverse());
} else {
for (int i = l; i < s.length; i++) {
if (s[l] != s[i] || l == i) {
swap(s, l, i);
permute(s, l + 1, ch);
swap(s, l, i);
}
}
}
}
}
```
```