Rearrange characters to form palindrome if possible - GeeksforGeeks

02 Mar, 2022
Given a string, convert the string to palindrome without any modifications like adding a character, removing a character, replacing a character etc. 
Examples: 
Input : "mdaam"
Output : "madam" or "amdma"

Input : "abb"
Output : "bab"

Input : "geeksforgeeks"
Output : "No Palindrome"
1. Count occurrences of all characters. 2. Count odd occurrences. If this count is greater than 1 or is equal to 1 and length of the string is even then obviously palindrome cannot be formed from the given string. 3. Initialize two empty strings firstHalf and secondHalf. 4. Traverse the map. For every character with count as count, attach count/2 characters to end of firstHalf and beginning of secondHalf. 5. Finally return the result by appending firstHalf and secondHalf
C++
Java
Python3
Javascript
// C++ program to rearrange a string to// make palindrome.#include <bits/stdc++.h>using namespace std; string getPalindrome(string str){     // Store counts of characters    unordered_map<char, int> hmap;    for (int i = 0; i < str.length(); i++)        hmap[str[i]]++;     /* find the number of odd elements.       Takes O(n) */    int oddCount = 0;    char oddChar;    for (auto x : hmap) {        if (x.second % 2 != 0) {            oddCount++;            oddChar = x.first;        }    }     /* odd_cnt = 1 only if the length of       str is odd */    if (oddCount > 1        || oddCount == 1 && str.length() % 2 == 0)        return "NO PALINDROME";     /* Generate first halh of palindrome */    string firstHalf = "", secondHalf = "";    for (auto x : hmap) {         // Build a string of floor(count/2)        // occurrences of current character        string s(x.second / 2, x.first);         // Attach the built string to end of        // and begin of second half        firstHalf = firstHalf + s;        secondHalf = s + secondHalf;    }     // Insert odd character if there    // is any    return (oddCount == 1)               ? (firstHalf + oddChar + secondHalf)               : (firstHalf + secondHalf);} int main(){    string s = "mdaam";    cout << getPalindrome(s);    return 0;}
// Java program to rearrange a string to// make palindromeimport java.util.HashMap;import java.util.Map.Entry; class GFG{ public static String getPalindrome(String str){         // Store counts of characters    HashMap<Character,            Integer> counting = new HashMap<>();    for(char ch : str.toCharArray())    {        if (counting.containsKey(ch))        {            counting.put(ch, counting.get(ch) + 1);        }        else        {            counting.put(ch, 1);        }    }         /* Find the number of odd elements.    Takes O(n) */    int oddCount = 0;    char oddChar = 0;         for(Entry<Character,              Integer> itr : counting.entrySet())    {        if (itr.getValue() % 2 != 0)        {            oddCount++;            oddChar = itr.getKey();        }    }         /* odd_cnt = 1 only if the length of    str is odd */    if (oddCount > 1 || oddCount == 1 &&        str.length() % 2 == 0)    {        return "NO PALINDROME";    }         /* Generate first halh of palindrome */    String firstHalf = "", lastHalf = "";    for(Entry<Character, Integer> itr : counting.entrySet())    {                 // Build a string of floor(count/2)        // occurrences of current character        String ss = "";        for(int i = 0; i < itr.getValue() / 2; i++)        {            ss += itr.getKey();        }                 // Attach the built string to end of        // and begin of second half        firstHalf = firstHalf + ss;        lastHalf = ss + lastHalf;    }         // Insert odd character if there    // is any    return (oddCount == 1) ?           (firstHalf + oddChar + lastHalf) :           (firstHalf + lastHalf);} // Driver codepublic static void main(String[] args){    String str = "mdaam";    System.out.println(getPalindrome(str));}} // This code is contributed by Satyam Singh
# Python3 program to rearrange a string to# make palindrome.from collections import defaultdict  def getPalindrome(st):     # Store counts of characters    hmap = defaultdict(int)    for i in range(len(st)):        hmap[st[i]] += 1     # Find the number of odd elements.    # Takes O(n)    oddCount = 0     for x in hmap:        if (hmap[x] % 2 != 0):            oddCount += 1            oddChar = x     # odd_cnt = 1 only if the length of    # str is odd    if (oddCount > 1 or oddCount == 1 and            len(st) % 2 == 0):        return "NO PALINDROME"     # Generate first halh of palindrome    firstHalf = ""    secondHalf = ""     for x in sorted(hmap.keys()):         # Build a string of floor(count/2)        # occurrences of current character        s = (hmap[x] // 2) * x         # Attach the built string to end of        # and begin of second half        firstHalf = firstHalf + s        secondHalf = s + secondHalf     # Insert odd character if there    # is any    if (oddCount == 1):        return (firstHalf + oddChar + secondHalf)    else:        return (firstHalf + secondHalf)  # Driver codeif __name__ == "__main__":     s = "mdaam"     print(getPalindrome(s)) # This code is contributed by ukasp
<script> // JavaScript program to rearrange a string to// make palindrome.function getPalindrome(str){     // Store counts of characters    let hmap = new Map();    for (let i = 0; i < str.length; i++){        if(hmap.has(str[i])){            hmap.set(str[i],hmap.get(str[i])+1);        }        else{            hmap.set(str[i],1);        }    }     /* find the number of odd elements.       Takes O(n) */    let oddCount = 0;    let oddChar;    for (let [x,y] of hmap) {        if (y % 2 != 0) {            oddCount++;            oddChar = x;        }    }     /* odd_cnt = 1 only if the length of       str is odd */    if (oddCount > 1        || oddCount == 1 && str.length % 2 == 0)        return "NO PALINDROME";     /* Generate first halh of palindrome */    let firstHalf = "", secondHalf = "";    for (let [x,y] of hmap) {         // Build a string of floor(count/2)        // occurrences of current character        let s = "";        for(let i = 0; i < Math.floor(y/2); i++){             s += x;        }         // Attach the built string to end of        // and begin of second half        firstHalf = firstHalf + s;        secondHalf = s + secondHalf;    }     // Insert odd character if there    // is any    return (oddCount == 1)               ? (firstHalf + oddChar + secondHalf)               : (firstHalf + secondHalf);} // driver programlet s = "mdaam";document.write(getPalindrome(s)); // This code is contributed by shinjanpatra.</script>
amdma
ukasp
satyamsinghkv2
shinjanpatra
cpp-unordered_map
frequency-counting
palindrome
Strings
Strings
palindrome
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Check for Balanced Brackets in an expression (well-formedness) using Stack
KMP Algorithm for Pattern Searching
Convert string to char array in C++
Longest Palindromic Substring | Set 1
Array of Strings in C++ (5 Different Ways to Create)
Caesar Cipher in Cryptography
Check whether two strings are anagram of each other
Top 50 String Coding Problems for Interviews
Length of the longest substring without repeating characters
How to split a string in C/C++, Python and Java?