class Solution {
vector<string> ans;
int n;
public:
vector<string> generatePalindromes(string s) {
//vector<int> count(128, 0);
map<int, int> map;
n = s.size();
for (char ch : s) {
map[ch]++; //统计每个ch的ascll
}
int odd = 0, idx;
for (auto i = map.begin(); i != map.end(); ++i)
{
if (i->second & 1)
{
odd++; //奇数个数
idx = (*i).first; //idx就是字符的ascll key
}
if (odd > 1)
return {};
}
s = odd ? string(1,idx) : ""; //将一个奇数按照idx ascll初始化为一个字符
odd ? map[idx]-- : 0; //奇数的字符-1
dfs(map, s); //无奇数传空 有则传一个
return ans;
}
void dfs(map<int, int> map, string s)
{
if (s.size() == n)
{
ans.push_back(s);//s长度够了返回
return;
}
for (auto i = map.begin(); i != map.end(); ++i)//遍历每一个可能的字符ascll
{
if (i->second)//如果该ascll有字符则加上 没有则下一个
{
i->second -= 2;//两侧加上相同字符,还是回文
dfs(map, char(i->first) + s + char(i->first));
i->second += 2;//回溯 一轮128遍历后恢复
}
}
}
};
测试:
int main(){
Solution s1;
vector<string> ret= s1.generatePalindromes(s);
for(int i=0;i<ret.size();i++)
{
cout << ret[i] << endl;
}
}