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;
    }