Problem Description:
Given a string, determine if a permutation of the string could form a palindrome.
For example,
"code"
-> False, "aab"
-> True, "carerac"
-> True. Hint:
-
-
- Consider the palindromes of odd vs even length. What difference do you notice?
- Count the frequency of each character.
- If each character occurs even number of times, then it must be a palindrome. How about character which occurs odd number of times?
-
Just check there are no more than 2 characters that appear an odd number of times in the string.
My C++ code using an array as a hash map is as follows.
1 class Solution {2 public:3 bool canPermutePalindrome(string s) {4 int odd = 0, counts[256] = { 0};5 for (char c : s)6 odd += ++counts[c] & 1 ? 1 : -1;7 return odd <= 1;8 }9 };
BTW, Stefan has posted many nice solutions , including the following one that uses bitset.
1 class Solution {2 public:3 bool canPermutePalindrome(string s) {4 bitset<256> b;5 for (char c : s) b.flip(c);6 return b.count() < 2;7 }8 };