力扣(LeetCode)267. 回文排列 II(2022.09.24)

力扣(LeetCode)267. 回文排列 II(2022.09.24),第1张

给定一个字符串 s ,返回 其重新排列组合后可能构成的所有回文字符串,并去除重复的组合 。

你可以按 任意顺序 返回答案。如果 s 不能形成任何回文排列时,则返回一个空列表。

示例 1:

输入: s = “aabb”
输出: [“abba”, “baab”]
示例 2:

输入: s = “abc”
输出: []

提示:

1 <= s.length <= 16
s 仅由小写英文字母组成

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/palindrome-permutation-ii

方法一:回溯

C++提交内容:

class Solution {
    vector<string> ans;
public:
    vector<string> generatePalindromes(string s) {
        vector<int> cnts(26);
        for (char c : s) cnts[c - 'a']++;  // 统计每个字符出现的个数
        string s1, oddChar;
        for (int i = 0, odd = 0; i < 26; i++) {
            if (cnts[i] % 2) {
                oddChar += ('a' + i);
                if (++odd > 1) return ans;  // 如果奇数字符个数 > 1, 则不可能构成回文串
            } 
        }
        for (int i = 0; i < 26; i++) s1 += string(cnts[i] / 2, ('a' + i));
        string s2 = s1;
        do {
            string str = s2;
            reverse(str.begin(), str.end());
            ans.push_back(s2 + oddChar + str);           
            next_permutation(s2.begin(), s2.end());
        } while (s2 != s1);
        return ans;
    }
};

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/3002872.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-27
下一篇 2022-09-27

发表评论

登录后才能评论

评论列表(0条)

保存