[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 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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