1. 题目
给定一个字符串 s ,返回其通过重新排列组合后所有可能的回文字符串,并去除重复的组合。
如不能形成任何回文排列时,则返回一个空列表。
示例 1:
输入: "aabb"
输出: ["abba", "baab"]
示例 2:
输入: "abc"
输出: []
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-permutation-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 对字符进行计数,判断能否生成回文串
- 然后把奇数个的1个字符放中间,回溯在字符两侧放一对相同的字符
class Solution {
vector<string> ans;
int n;
public:
vector<string> generatePalindromes(string s) {
vector<int> count(128,0);
n = s.size();
for(char ch : s)
count[ch]++;
int odd = 0, idx;
for(int i = 0; i < 128; ++i)
{
if(count[i]&1)
{
odd++;
idx = i;
}
if(odd > 1)
return {};
}
s = odd ? string(1, idx) : "";
odd ? count[idx]-- : 0;//奇数的字符-1
dfs(count,s);
return ans;
}
void dfs(vector<int>& count, string s)
{
if(s.size()==n)
{
ans.push_back(s);//长度够了返回
return;
}
for(int i = 0; i < 128; ++i)
{
if(count[i])
{
count[i] -= 2;//两侧加上相同字符,还是回文
dfs(count, char(i)+s+char(i));
count[i] += 2;//回溯
}
}
}
};
4 ms 6.9 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2bs1ihf8vfpcc