Open In App

Rearrange characters to form palindrome if possible

Improve
Improve
Like Article
Like
Save
Share
Report

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

Implementation:

C++




// 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 half 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




// Java program to rearrange a string to
// make palindrome
import 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 half 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 code
public static void main(String[] args)
{
    String str = "mdaam";
    System.out.println(getPalindrome(str));
}
}
 
// This code is contributed by Satyam Singh


Python3




# 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 half 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 code
if __name__ == "__main__":
 
    s = "mdaam"
 
    print(getPalindrome(s))
 
# This code is contributed by ukasp


C#




// C# program to rearrange a string to
// make palindrome
using System;
using System.Collections.Generic;
 
class GFG {
 
  static String getPalindrome(string str)
  {
 
    // Store counts of characters
    Dictionary<char, int> counting
      = new Dictionary<char, int>();
    foreach(char ch in str.ToCharArray())
    {
      if (counting.ContainsKey(ch)) {
        counting[ch] = counting[ch] + 1;
      }
      else {
        counting.Add(ch, 1);
      }
    }
 
    /* Find the number of odd elements.
        Takes O(n) */
    int oddCount = 0;
    char oddChar = '$';
 
    foreach(KeyValuePair<char, int> itr in counting)
    {
      if (itr.Value % 2 != 0) {
        oddCount++;
        oddChar = itr.Key;
      }
    }
 
    /* 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 half of palindrome */
    string firstHalf = "", lastHalf = "";
    foreach(KeyValuePair<char, int> itr in counting)
    {
 
      // Build a string of floor(count/2)
      // occurrences of current character
      string ss = "";
      for (int i = 0; i < itr.Value / 2; i++) {
        ss += itr.Key;
      }
 
      // 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 code
  public static void Main()
  {
    string str = "mdaam";
    Console.WriteLine(getPalindrome(str));
  }
}
 
// This code is contributed by Samim Hossain Mondal.


Javascript




<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 half 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 program
let s = "mdaam";
document.write(getPalindrome(s));
 
// This code is contributed by shinjanpatra.
</script>


Output

amdma


Last Updated : 21 Nov, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads