根据字符串长度,「回文串」可分为两种情况:
- 「回文串」长度为偶数:所有不同字符的出现次数都为「偶数」;
- 「回文串」长度为奇数:位于中点的字符出现「奇数」次,其余字符出现「偶数」次;
因此,某字符串是回文串排列之一的「充要条件」为:此字符串中,最多只有一种字符的出现次数为「奇数」,其余所有字符的出现次数都为「偶数」。
考虑使用「哈希表」统计给定字符串中各字符的数量,再根据以上规则判断字符串是否为回文串排列之一。
class Solution:
def canPermutePalindrome(self, s: str) -> bool:
# dic = {} # 创建哈希表,统计每个字符出现次数
# for i in s:
# if i in dic:
# dic[i] += 1
# else:
# dic[i] = 1
# odd = 0 # 统计奇数个字符个数
# for j in dic:
# if dic[j] %2 == 1:
# odd += 1
# if odd > 1:
# return False
# return True
from collections import Counter # 调用工具包,与上述思路相同
counter = Counter(s)
odd = 0 # 统计奇数个字符个数
for key in counter.keys():
if counter[key] %2 == 1:
odd += 1
if odd > 1:
return False
return True
复杂度分析:
- 时间复杂度 O(N) : 其中 N 为字符串长度;哈希表统计字符数量迭代 NN 次,判断是否为回文串最多迭代 N 次,总体使用 O(N+N)=O(N) 时间;
- 空间复杂度 O(N) : 哈希表 dic 使用 O(N)大小的额外空间;