GFG App
Open App
Browser
Continue

# Rearrange characters to form palindrome if possible

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"

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 ` `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 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 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 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

 ``

Output

`amdma`

My Personal Notes arrow_drop_up