[leetcode] 267. Palindrome Permutation II 解题报告

题目链接: https://leetcode.com/problems/palindrome-permutation-ii/

Given a string s, return all the palindromic permutations (without duplicates) of it. Return an empty list if no palindromic permutation could be form.

For example:

Given s = "aabb", return ["abba", "baab"].

Given s = "abc", return [].


思路: 统计给定字符串中每个字符的个数, 如果有多于一个单数的字符, 说明是无法构成回文的, 此时返回[]. 

如果只有一个单数字符或者没有单数字符, 就将出现偶数次的字符分成两半, 一半用来做全排列, 然后组合成一个回文数. 其组成为: 全排列字符串+ 出现单数次的字符+全排列字符串翻转.

代码如下:

class Solution {
public:
    vector generatePalindromes(string s) {
        vector result;
        map hash;
        string str, tem;
        for(auto ch: s) hash[ch]++;
        for(auto val: hash) 
        {
            if(val.second%2 ==1) tem += val.first;
            if(val.second >1) str += string(val.second/2, val.first);
        }
        if(tem.size() > 1) return {};
        do
        {
            string revStr = str;
            reverse(revStr.begin(), revStr.end());
            result.push_back(str+tem+revStr);
        }while(next_permutation(str.begin(), str.end()));
        return result;
    }
};


你可能感兴趣的:(string,leetcode,排列组合,回文数)