Print all palindrome permutations of a string

30 Jun, 2022
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

Input:  str = "aabbcadad"
Output: aabdcdbaa aadbcbdaa abadcdaba
        abdacadba adabcbada adbacabda
        baadcdaab badacadab bdaacaadb
        daabcbaad dabacabad dbaacaabd
Generation of palindrome can be done by following steps,
First we need to check whether letters of string can make a palindrome or not, if not then return.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.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.
First we need to check whether letters of string can make a palindrome or not, if not then return.
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.
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++
// C++ program to print all palindrome permutations of// a string.#include <bits/stdc++.h>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 functionint main(){    string str = "aabbcadad";    cout << "All palindrome permutations of " << str << endl;    printAllPossiblePalindromes(str);    return 0;}
All palindrome permutations of aabbcadad
aabdcdbaa
aadbcbdaa
abadcdaba
abdacadba
adabcbada
adbacabda
baadcdaab
badacadab
bdaacaadb
daabcbaad
dabacabad
dbaacaabd

Time Complexity: O((n/2)!), where n is the length of string and we are finding all possible permutations of half of it.Auxiliary Space: O(1)
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 : 
aabdcdbaa   aadbcbdaa   abadcdaba   abdacadba
adabcbada   adbacabda   baadcdaab   badacadab
bdaacaadb   daabcbaad   dabacabad   dbaacaabd
This article is contributed by Utkarsh Trivedi.
rkbhola5
shivamanandrj9
hardikkoriintern
palindrome
permutation
Strings
Strings
permutation
palindrome
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Python program to check if a string is palindrome or not
Longest Palindromic Substring | Set 1
What is Data Structure: Types, Classifications and Applications
Top 50 String Coding Problems for Interviews
Length of the longest substring without repeating characters
Check whether two strings are anagram of each other
Convert string to char array in C++
Reverse words in a given string
Print all the duplicates in the input string
Reverse string in Python (6 different ways)