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()