LeetCode 267. 回文排列 II(回溯)

文章目录

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;//奇数的字符-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


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明
我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2bs1ihf8vfpcc

  • 26
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Michael阿明

如果可以,请点赞留言支持我哦!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值