LeetCode【0266】回文排列

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 1s.length5000
  • 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 题目总结

题目难度:简单
数据类型:字符串
应用算法:异或算法应用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AnFany

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值