来源
题目简述
给定一个字符串,判断字符串是否存在一个排列是回文排列。
样例
样例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
后续更新(挖坑)