package com.anuragkapur.ctci6ed.arraysandstrings; import java.util.HashMap; import java.util.Map; /** * @author anuragkapur */ public class PalindromePermutation { /** * Run time complexity: O(n) * * @param input * @return */ public boolean isPalindromePermutation(String input) { if (input == null) { return false; } String singleSpace = " "; int emptySpaceCodePoint = singleSpace.codePointAt(0); input = input.toLowerCase(); int charCount = input.codePointCount(0, input.length()); int initialCapacityForNoRehashes = (int)(charCount / 0.75) + 1; Map<Integer, Boolean> charCountOdd = new HashMap<>(initialCapacityForNoRehashes); for (int i = 0; i < charCount; i++) { int codePoint = input.codePointAt(i); if (codePoint != emptySpaceCodePoint) { if(charCountOdd.containsKey(codePoint)) { Boolean isOdd = charCountOdd.get(codePoint); charCountOdd.put(codePoint, !isOdd); } else { charCountOdd.put(codePoint, true); } } } int totalOddChars = 0; for (Integer codePoint : charCountOdd.keySet()) { if (charCountOdd.get(codePoint)) { totalOddChars ++; } if (totalOddChars > 1) { return false; } } return true; } }