题目链接: https://leetcode.com/problems/palindrome-permutation-ii/
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 []
.
思路: 统计给定字符串中每个字符的个数, 如果有多于一个单数的字符, 说明是无法构成回文的, 此时返回[].
如果只有一个单数字符或者没有单数字符, 就将出现偶数次的字符分成两半, 一半用来做全排列, 然后组合成一个回文数. 其组成为: 全排列字符串+ 出现单数次的字符+全排列字符串翻转.
代码如下:
class Solution {
public:
vector<string> generatePalindromes(string s) {
vector<string> result;
map<char, int> hash;
string str, tem;
for(auto ch: s) hash[ch]++;
for(auto val: hash)
{
if(val.second%2 ==1) tem += val.first;
if(val.second >1) str += string(val.second/2, val.first);
}
if(tem.size() > 1) return {};
do
{
string revStr = str;
reverse(revStr.begin(), revStr.end());
result.push_back(str+tem+revStr);
}while(next_permutation(str.begin(), str.end()));
return result;
}
};