1. 回文排列问题解析
"回文排列"这道题看似简单,却能让不少程序员在面试中栽跟头。我第一次遇到这个问题是在一次技术面试中,当时面试官轻描淡写地说:"写个函数判断字符串能否排列成回文",结果我花了15分钟才给出完整解答。这道题的价值在于它完美检验了开发者对基础数据结构的掌握程度和问题拆解能力。
回文排列的核心是判断给定的字符串字符能否通过重新排列组合形成一个回文。回文是指正读反读都相同的字符串,比如"madam"或"racecar"。而排列则意味着我们可以任意调整字符的顺序。看似简单的要求背后,隐藏着对字符出现频率的精确计算和奇偶性判断。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题本质与解法思路
2.1 回文排列的数学本质
回文排列问题本质上是一个字符频率统计问题。要构成回文,字符串必须满足以下条件之一:
- 所有字符出现次数都为偶数(对称结构)
- 只有一个字符出现次数为奇数(中间字符),其余均为偶数
这个规律来源于回文串的对称特性。想象一下回文的结构:从中心向两边扩展,每边的字符必须成对出现(除了可能的中心字符)。这就是为什么我们最多只能允许一个字符出现奇数次。
2.2 基础解法:哈希表统计
最直观的解法是使用哈希表(或字典)统计每个字符的出现次数:
python复制def can_permute_palindrome(s: str) -> bool:
char_count = {}
for char in s:
char_count[char] = char_count.get(char, 0) + 1
odd_count = 0
for count in char_count.values():
if count % 2 != 0:
odd_count += 1
if odd_count > 1:
return False
return True
这个解法的时间复杂度是O(n),空间复杂度是O(k)(k是不同字符的数量)。对于ASCII字符串,k最多是128(扩展ASCII)或256(Unicode),可以视为常数空间。
2.3 优化解法:集合处理
我们可
