cielux
10/15/2018 - 6:24 AM

Has Palindrome Permutation

Write an efficient function that checks whether any permutation of an input string is a palindrome.

function hasPalindromePermutation(theString) {
  // Check if any permutation of the input is a palindrome
  let singleChars = new Set();

  for (let char of theString) {
    if (singleChars.has(char)) {
      singleChars.delete(char);
    } else {
      singleChars.add(char);
    }
  }
  return singleChars.size <= 1;
}

// Tests

let desc = 'permutation with odd number of chars';
assertEqual(hasPalindromePermutation('aabcbcd'), true, desc);

desc = 'permutation with even number of chars';
assertEqual(hasPalindromePermutation('aabccbdd'), true, desc);

desc = 'no permutation with odd number of chars';
assertEqual(hasPalindromePermutation('aabcd'), false, desc);

desc = 'no permutation with even number of chars';
assertEqual(hasPalindromePermutation('aabbcd'), false, desc);

desc = 'empty string';
assertEqual(hasPalindromePermutation(''), true, desc);

desc = 'one character string ';
assertEqual(hasPalindromePermutation('a'), true, desc);

function assertEqual(a, b, desc) {
  if (a === b) {
    console.log(`${desc} ... PASS`);
  } else {
    console.log(`${desc} ... FAIL: ${a} != ${b}`);
  }
}

console.log()