Palindrome Permutation II
Given a string
s
, return all the palindromic permutations (without duplicates) of it. Return an empty list if no palindromic permutation could be form.For example:
Given
s = "aabb"
, return["abba", "baab"]
.Given
s = "abc"
, return[]
.
First, count the frequency of the each character in the string. If there are more than 1 characters whose frequency is odd, it can’t form a palindrome by permutation.
Second, use DFS to construct the palindrome.
class Solution { public: vector<string> generatePalindromes(string s) { vector<string> ans; string ps; unordered_map<char, int> map; for(size_t i = 0; i < s.size(); i++){ if(map.find(s[i]) == map.end()){ map[s[i]] = 1; } else{ map[s[i]]++; } } int count = 0; char c; for(auto it = map.begin(); it != map.end(); it++){ if(it->second % 2 == 1){ count++; c = it->first; } } if(count > 1) return ans;//can not form a palindrome if(count == 1){ ps.push_back(c);//center of the palindrome string map[c]--; } DFS(map, ps, ans); return ans; } void DFS(unordered_map<char, int> map, string s, vector<string> & ans){ int isEnd = true; for(auto it = map.begin(); it != map.end(); it++){ if(it->second > 0) isEnd = false; } if(isEnd == true){ ans.push_back(s); return ; } //non leaf node of tree for(auto it = map.begin(); it != map.end(); it++){ if(it->second > 0){ it->second -= 2; s.insert(0, 1, it->first); s.push_back(it->first); DFS(map, s, ans); s.erase(0,1); s.pop_back(); it->second += 2; } } } };