【随缘刷题】回文排列-BitSet实现

来源

916. 回文排列

题目简述

给定一个字符串,判断字符串是否存在一个排列是回文排列。

样例

样例1

输入: s = "code"
输出: False
解释:
没有合法的回文排列

样例2

输入: s = "aab"
输出: True
解释:
"aab" --> "aba"

样例3

输入: s = "carerac"
输出: True
解释:
"carerac" --> "carerac"

问题分析

这道题的问的是给出一个字符串,字符串中的字节所有字符能不能组成一个回文排列。
首先回文排列是什么样的,我们可以分为两种情况:

  • 当字符串长度为偶数个,只需要每个字符出现偶数次我们就可以组成回文排列。
  • 当字符串长度为奇数个,只能存在一个字符出现奇数次,其余字符均必须出现偶数次。

那么我们可以先计算出字符串中每一个字符出现的次数,然后在判断出现奇数次的字符的个数,只需要个数<2,那么久能够满足题意:

编码实现

private static boolean canPermutePalindrome(String s) {
    int len = s.length();
    int oddCount = 0;
    Map<Character, Integer> map = new HashMap<Character, Integer>();
    for (int i = 0; i < len; i++) {
        if (null != map.get(s.charAt(i))){
            map.put(s.charAt(i), map.get(s.charAt(i)) + 1);
            continue;
        }
        map.put(s.charAt(i), 1);
    }
    Set<Character> set = map.keySet();
    Iterator<Character> iterator = set.iterator();
    while (iterator.hasNext()){
        if (map.get(iterator.next()) % 2 == 1) oddCount++;
    }
    return oddCount > 2 ? false : true;
} 

但是,代码如此繁杂主要是因为自己认识的工具不足导致。因为在查询题解时发现以下解题方法,代码十分简洁,这里推荐给大家:

来自九章算法题解
public boolean canPermutePalindrome(String s) {
    BitSet bs = new BitSet();
    for (byte b : s.getBytes()) {
        //flip(int bitIndex):将指定索引处的位设置为其当前值的补码。
        bs.flip (b);
    }
    //cardinality():返回此 BitSet 中设置为 true 的位数。
    return bs.cardinality() < 2;
}

关于BitSet

后续更新(挖坑)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值