[LeetCode] 267. 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.

Example 1:

"aabb"
["abba", "baab"]

Example 2:

"abc"
[]

回文排列II。

给定一个字符串 s ,返回其通过重新排列组合后所有可能的回文字符串,并去除重复的组合。如不能形成任何回文排列时,则返回一个空列表。

思路是backtracking。对于一个input字符串而言,他自己不一定是回文,但是如果字符串里面只有至多一个字符的出现次数是奇数,其他字符的出现次数都是偶数,那么他的permutation就可以组成回文。所以我们首先统计一下input字符串里面各个字母的出现次数,如果统计结果不能满足回文的条件则返回一个空集res,否则我们就可以开始找可以组成的回文串。

我们先找一下,是否有出现过奇数次数的字母,如果有,则这个字母只能作为回文串中间的那个字母。之后就是用一个helper函数去做permutation。退出条件就是生成的字符串的长度和input字符串的长度一样,加入结果集。

时间 - ?

空间O(n)

Java实现

复制代码
 1 class Solution {
 2     public List<String> generatePalindromes(String s) {
 3         List<String> res = new ArrayList<>();
 4         int[] map = new int[256];
 5         int odd = 0;
 6         for (char c : s.toCharArray()) {
 7             map[c]++;
 8             if (map[c] % 2 == 1) {
 9                 odd++;
10             } else {
11                 odd--;
12             }
13         }
14 
15         // corner case
16         if (s.length() == 0 || odd > 1) {
17             return res;
18         }
19         // normal case
20         String temp = "";
21         for (int i = 0; i < 256 && odd == 1; i++) {
22             if (map[i] % 2 == 1) {
23                 temp += (char) i;
24                 map[i]--;
25                 break;
26             }
27         }
28         helper(res, temp, map, s.length());
29         return res;
30     }
31 
32     private void helper(List<String> res, String temp, int[] map, int n) {
33         if (temp.length() == n) {
34             res.add(temp);
35             return;
36         }
37         for (int i = 0; i < 256; i++) {
38             if (map[i] > 0) {
39                 map[i] -= 2;
40                 helper(res, (char) i + temp + (char) i, map, n);
41                 map[i] += 2;
42             }
43         }
44     }
45 }
复制代码

 

LeetCode 题目总结

posted @   CNoodle  阅读(203)  评论(0编辑  收藏  举报
编辑推荐:
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 程序员常用高效实用工具推荐,办公效率提升利器!
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
历史上的今天:
2019-11-13 [LeetCode] 16. 3Sum Closest
点击右上角即可分享
微信分享提示