回文排列

给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。
回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。
回文串不一定是字典当中的单词。
提供三种解法

解法一:利用数组统计每个字符出现次数,如果出现次数为奇数,并且小于2,那么它就是回文排列

public static boolean canPermutePalindrome1(String s){
        int[] arr = new int[255];
        int count = 0;
        for(int i = 0;i<s.length();i++){
            arr[s.charAt(i) - (char)0]++;
        }
        for(int i = 0;i < 255;i++){
            if(arr[i]%2 != 0){
                count++;
            }
        }
        return count < 2;
    }

解法二:利用set集合,如果set集合不包含该字符,add,包含的话,remove

public static boolean canPermutePalindrome2(String s){
        Set<Character> set = new HashSet<>();
        for(int i = 0;i<s.length();i++){
            if(!set.add(s.charAt(i))){
                set.remove(s.charAt(i));
            }else {
                set.add(s.charAt(i));
            }
        }
        return set.size()<2;
 }

解法三:利用位运算,结合BigInteger来进行操作

public static boolean canPermutePalindrome3(String s){
        BigInteger result = new BigInteger("0");
        for(int i = 0;i<s.length();i++){
            result = result.xor(new BigInteger("1").shiftLeft(s.charAt(i)));
        }
        return result.and(result.subtract(new BigInteger("1"))).toString().equals("0");
}
原文地址:https://www.cnblogs.com/du001011/p/14152911.html