面试题 01.04. 回文排列
给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。
回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。
回文串不一定是字典当中的单词。
示例1:
输入:"tactcoa"
输出:true(排列有"tacocat"、"atcocta",等等)
哈希
class Solution {
public boolean canPermutePalindrome(String s) {
HashMap<Character,Integer> map = new HashMap<>();
boolean flag = false;
for(int i=0;i<s.length();i++){
char a = s.charAt(i);
if(map.containsKey(a)){
Integer b = map.get(a);
map.replace(a,++b);
}
else
map.put(a,1);
}
Set<Map.Entry<Character,Integer>> es = map.entrySet();
for(Map.Entry<Character,Integer> e : es)
if(e.getValue()%2==1){
if(!flag)
flag = true;
else
return false;
}
return true;
}
}
class Solution {
public boolean canPermutePalindrome(String s) {
if(s==null)
return false;
HashSet<Character> hashset = new HashSet<>();
for(int i = 0;i < s.length();i++){
char c = s.charAt(i);
if(hashset.contains(c))
hashset.remove(c);
else
hashset.add(c);
}
return hashset.size()<=1;
}
}
位运算
class Solution {
public boolean canPermutePalindrome(String s) {
// ascii码总共有128位,所以需要两个long进行表示,char字符底层是ascii码
long high = 0,low = 0;
for(char c : s.toCharArray()){
if(c>=64)
high ^= 1L<<(c-64);
else
low ^= 1L<<c;
}
return Long.bitCount(high)+Long.bitCount(low)<=1;
}
}