1 中文题目
给定一个字符串 s
,如果该字符串的某个排列是 回文串
(向前和向后读都相同的字符串。) ,则返回 True
;否则,返回 False
。
示例:
输入:s = "code"
输出:False
输入:s = "aab"
输出:True
输入:s = "carerac"
输出:True
提示:
- 1 ≤ s . l e n g t h ≤ 5000 1 \leq s.length \leq 5000 1≤s.length≤5000
s
仅由小写英文字母组成
2 Python求解
2.1 求解思路
利用回文串的特性,除了最多一个字符可以出现奇数次外,其他字符必须出现偶数次。使用集合数据结构来追踪出现奇数次的字符,最后检查奇数次字符的个数是否不超过1个。
2.2 涉及方法
- 异或思想的集合应用(XOR Set Operation)。虽然这里没有直接使用位运算,但采用了类似异或运算的思想 - 相同的元素相消,将其应用到集合操作中,通过添加和删除操作来统计字符出现次数的奇偶性。
2.3 求解示例
示例分析:以s = "code"为例
初始odd_chars = {}
处理'c': odd_chars = {'c'}
处理'o': odd_chars = {'c', 'o'}
处理'd': odd_chars = {'c', 'o', 'd'}
处理'e': odd_chars = {'c', 'o', 'd', 'e'}
最终odd_chars长度为4 > 1,返回False
因为每个字符都只出现一次(奇数次),无法构成回文排列
2.4 Python代码
class Solution:
def canPermutePalindrome(self, s: str) -> bool:
# 使用set来记录出现奇数次的字符
# 每次遇到字符就将其加入或移除set
odd_chars = set()
# 遍历字符串中的每个字符
for char in s:
# 如果字符已在set中(出现奇数次)
# 则移除它(变为偶数次)
if char in odd_chars:
odd_chars.remove(char)
# 如果字符不在set中(出现偶数次或首次出现)
# 则添加它(变为奇数次)
else:
odd_chars.add(char)
# 最后判断奇数次字符的个数是否小于等于1
# 如果是空字符串或只有一个字符出现奇数次,可以构成回文排列
return len(odd_chars) <= 1
2.5 复杂度分析
- 时间复杂度为O(n),其中n是字符串长度,需要遍历一次字符串,且集合的添加和删除操作的平均时间复杂度为O(1)。
- 空间复杂度为O(k),其中k是字符集大小(不同字符的数量),最坏情况下需要存储所有不同的字符。在实际应用中,由于字符集通常是有限的(如ASCII或Unicode的子集),空间复杂度可以认为是O(1)。
3 题目总结
题目难度:简单
数据类型:字符串
应用算法:异或算法应用