城市建设,专业seo站长工具全面查询网站,wordpress外链转跳页面,门户网站要用什么软件做题目难度: 简单原题链接 题目描述给定一个字符串#xff0c;编写一个函数判定其是否为某个回文串的排列之一。回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。回文串不一定是字典当中的单词。示例 1#xff1a;输入#xff1a;tactcoa 输出…题目难度: 简单 原题链接 题目描述给定一个字符串编写一个函数判定其是否为某个回文串的排列之一。回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。回文串不一定是字典当中的单词。示例 1输入tactcoa 输出true排列有tacocat、atcocta等等题目思考什么字符串是回文串的排列能否做到常数空间复杂度解决方案思路分析题目输入不需要是回文串只需要其某种排列满足回文串即可所以我们可以从回文串的性质入手回文串有两种形式一种是中间单独一个字符两边对称还有一种是最中间两个字符也对称。也就是说回文串中最多只有一个字符的出现次数为 1其他都必须为偶数所以我们可以使用一个计数字典来统计是否满足上述要求即可以上就是核心的思路接下来我们考虑如何优化空间。这里我们无需知道精确的次数而是只需要知道奇偶性所以我们可以利用异或操作这样就只需要一个变量而不需要字典了。具体做法如下使用一个 mask 字符的 ASCII 码来统计奇偶每次遍历一个字符就把对应位取异或这样最后如果 mask 上最多只有一个 1则说明最多只有一个奇数次数的字符满足题意这里判断是否最多有一个 1 可以复用统计 1 的个数的方法即mask (mask-1)如果它是 0则说明要么 mask 本身是 0要么 mask 是 2 的幂一定只有一个 1复杂度时间复杂度 O(N): 需要遍历字符串一遍空间复杂度: 使用计数字典 - O(N)使用位运算 - O(1)代码方案 1 - 计数字典from collections import defaultdictclass Solution:def canPermutePalindrome(self, s: str) - bool:# 方法1: 计数字典, 最多只能有一个字符计数为奇数d defaultdict(int)for c in s:d[c] 1# 判断次数为奇数的字符个数最多为1return sum(x 1 for x in d.values()) 1方案 2 - 异或位运算class Solution:def canPermutePalindrome(self, s: str) - bool:# 方法2: 位运算, 异或1ord, 最多只有一位是1才可以!mask 0for c in s:mask ^ 1 ord(c)return mask (mask - 1) 0