文章目录
- 1. 题目
- 2. 解题
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;//奇数的字符-1dfs(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