给定一个字符串 s ,返回其通过重新排列组合后所有可能的回文字符串,并去除重复的组合。
如不能形成任何回文排列时,则返回一个空列表。
示例 1: 输入: "aabb" 输出: ["abba", "baab"] 示例 2: 输入: "abc" 输出: []
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/palindrome-permutation-ii 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
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 我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2bs1ihf8vfpcc
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句