# Print all palindrome permutations of a string

Given a string, we need to print all possible palindromes that can be generated using letters of that string.

Examples:

```Input:  str = "aabcb"
Output: abcba bacab

```

## Recommended: Please solve it on “PRACTICE” first, before moving on to the solution.

Generation of palindrome can be done by following steps,

1. First we need to check whether letters of string can make a palindrome or not, if not then return.
2. After above checking we can make half part of first palindrome string (lexicographically smallest) by taking half frequency of each letter of the given string.
3. Now traverse through all possible permutation of this half string and each time add reverse of this part at the end and add odd frequency character in mid between if string is of odd length, for making the palindrome.

Below is C++ implementation.

 `// C++ program to print all palindrome permutations of ` `// a string. ` `#include ` `using` `namespace` `std; ` `#define M 26 ` ` `  `/* Utility function to count frequencies and checking ` `    ``whether letter can make a palindrome or not */` `bool` `isPalin(string str, ``int``* freq) ` `{ ` `    ``/* Initialising frequency array with all zeros */` `    ``memset``(freq, 0, M * ``sizeof``(``int``)); ` `    ``int` `l = str.length(); ` ` `  `    ``/* Updating frequency according to given string */` `    ``for` `(``int` `i = 0; i < l; i++) ` `        ``freq[str[i] - ``'a'``]++; ` ` `  `    ``int` `odd = 0; ` ` `  `    ``/* Loop to count total letter with odd frequency */` `    ``for` `(``int` `i = 0; i < M; i++) ` `        ``if` `(freq[i] % 2 == 1) ` `            ``odd++; ` ` `  `    ``/* Palindrome condition : ` `    ``if length is odd then only one letter's frequency must be odd ` `    ``if length is even no letter should have odd frequency */` `    ``if` `((l % 2 == 1 && odd == 1 ) || (l %2 == 0 && odd == 0)) ` `        ``return` `true``; ` `    ``else` `        ``return` `false``; ` `} ` ` `  `/* Utility function to reverse a string */` `string reverse(string str) ` `{ ` `    ``string rev = str; ` `    ``reverse(rev.begin(), rev.end()); ` `    ``return` `rev; ` `} ` ` `  `/* Function to print all possible palindromes by letter of ` `    ``given string */` `void` `printAllPossiblePalindromes(string str) ` `{ ` `    ``int` `freq[M]; ` ` `  `    ``// checking whether letter can make palindrome or not ` `    ``if` `(!isPalin(str, freq)) ` `        ``return``; ` ` `  `    ``int` `l = str.length(); ` ` `  `    ``// half will contain half part of all palindromes, ` `    ``// that is why pushing half freq of each letter ` `    ``string half = ``""``; ` `    ``char` `oddC; ` `    ``for` `(``int` `i = 0; i < M; i++) ` `    ``{ ` `        ``/* This condition will be true at most once */` `        ``if``(freq[i] % 2 == 1) ` `            ``oddC = i + ``'a'``; ` ` `  `        ``half += string(freq[i] / 2, i + ``'a'``); ` `    ``} ` ` `  `    ``/* palin will store the possible palindromes one by one */` `    ``string palin; ` ` `  `    ``// Now looping through all permutation of half, and adding ` `    ``// reverse part at end. ` `    ``// if length is odd, then pushing oddCharacter also in mid ` `    ``do` `    ``{ ` `        ``palin = half; ` `        ``if` `(l % 2 == 1) ` `            ``palin += oddC; ` `        ``palin += reverse(half); ` `        ``cout << palin << endl; ` `    ``} ` `    ``while` `(next_permutation(half.begin(), half.end())); ` `} ` ` `  `// Driver Program to test above function ` `int` `main() ` `{ ` `    ``string str = ``"aabbcadad"``; ` `    ``cout << ``"All palindrome permutations of "` `<< str << endl; ` `    ``printAllPossiblePalindromes(str); ` `    ``return` `0; ` `}`

Output:

```All palindrome permutations of aabbcadad
aabdcdbaa
dbaacaabd```

Illustration :

```Let given string is "aabbcadad"

Letters have following frequencies :
a(4), b(2), c(1), d(2).

As all letter has even frequency except one we can
make palindromes with the letter of this string.

Now half part is – aabd

So traversing through all possible permutations of
this half string and adding odd frequency character
and reverse of string at the end we get following
possible palindrome as final result :