给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。
回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。
回文串不一定是字典当中的单词。
提供三种解法
解法一:利用数组统计每个字符出现次数,如果出现次数为奇数,并且小于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"); }