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

62 篇文章 0 订阅
7 篇文章 0 订阅

题目链接: 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<string> generatePalindromes(string s) {
        vector<string> result;
        map<char, int> 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;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值