# Minimum removal to make palindrome permutation

Given a string S, we have to find minimum characters that we can remove to make any permutation of the string S a palindrome.

In simple terms, the problem states that: Make the string a palindrome by rearranging it in any way by removing the minimum number of characters including removing 0 number of character if possible.**Note** : we are considering only small alphabets. **Examples :**

Input : geeksforgeeks Output : 2 Explanation : if we remove 2 characters lets say 'f' and 'r', we remain with "geeksogeeks" which can be re-arranged like "skeegogeeks" to make it a palindrome. Removal of less than 2 character wouldn't make this string a palindrome. Input : shubham Output : 4 If we remove any 4 characters except 'h' (let's say 's', 'b', 'a', 'm'), we remain with "huh" which is a palindrome.

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the **DSA Self Paced Course** at a student-friendly price and become industry ready. To complete your preparation from learning a language to DS Algo and many more, please refer **Complete Interview Preparation Course****.**

In case you wish to attend **live classes **with experts, please refer **DSA Live Classes for Working Professionals **and **Competitive Programming Live for Students**.

A **Naive** approach would check every permutation of the string for palindrome and if not found then remove one character and check again. This approach is very complicated and will take a lot of time.

A **efficient** approach would be to notice that we don’t need to print the minimum characters, just the minimum number. So, an effective idea is the key that: there can be two types of a palindrome, even length, and odd length palindrome. We can deduce the fact that an even length palindrome must have every character occurring even number of times(i.e. the frequency of every character is even). Similarly, an odd palindrome must have every character occurring even number of times except one character occurring odd number of times.

From these facts, the problem turn out to be quite simple. We check frequency of every character and those characters occurring odd number of times are then counted. Then the result is total count of odd frequency characters subtraction 1.

## C++

`// CPP Program to find minimum number of removal to` `// make any permutation of the string a palindrome` `#include <iostream>` `using` `namespace` `std;` `#define MAX_CHAR 26` `// function to find minimum removal of characters` `int` `minRemoval(string str) {` ` ` `// hash to store frequency of each character` ` ` `int` `hash[MAX_CHAR];` ` ` `// to set hash array to zeros` ` ` `memset` `(hash, 0, ` `sizeof` `(hash));` ` ` `// count frequency of each character` ` ` `for` `(` `int` `i = 0; str[i]; i++)` ` ` `hash[str[i] - ` `'a'` `]++;` ` ` `// count the odd frequency characters` ` ` `int` `count = 0;` ` ` `for` `(` `int` `i = 0; i < MAX_CHAR; i++)` ` ` `if` `(hash[i] % 2)` ` ` `count++;` ` ` `// if count is -1 return 0` ` ` `// otherwise return count` ` ` `return` `(count == 0) ? 0 : count-1;` `}` `// Driver's Code` `int` `main() {` ` ` `string str = ` `"geeksforgeeks"` `;` ` ` `cout << minRemoval(str) << endl;` ` ` `return` `0;` `}` |

## Java

`// Java Program to find minimum number of removal to` `// make any permutation of the string a palindrome` `import` `java.util.Arrays;` `class` `GFG {` ` ` `static` `final` `int` `MAX_CHAR = ` `26` `;` ` ` `// function to find minimum removal of characters` ` ` `static` `int` `minRemoval(String str) {` ` ` `// hash to store frequency of each character` ` ` `int` `hash[] = ` `new` `int` `[MAX_CHAR];` ` ` `// to set hash array to zeros` ` ` `Arrays.fill(hash, ` `0` `);` ` ` `// count frequency of each character` ` ` `for` `(` `int` `i = ` `0` `; i < str.length(); i++)` ` ` `hash[str.charAt(i) - ` `'a'` `]++;` ` ` `// count the odd frequency characters` ` ` `int` `count = ` `0` `;` ` ` `for` `(` `int` `i = ` `0` `; i < MAX_CHAR; i++)` ` ` `if` `(hash[i] % ` `2` `== ` `1` `)` ` ` `count++;` ` ` `// if count is -1 return 0` ` ` `// otherwise return count` ` ` `return` `(count == ` `0` `) ? ` `0` `: count - ` `1` `;` ` ` `}` ` ` `// Driver code` ` ` `public` `static` `void` `main(String[] args) {` ` ` `String str = ` `"geeksforgeeks"` `;` ` ` `System.out.println(minRemoval(str));` ` ` `}` `}` `// This code is contributed by Anant Agarwal.` |

## Python

`# Python Program to find minimum number of` `# removal to make any permutation of the` `# string a palindrome` `# function to find minimum removal of` `# characters` `def` `minRemoval(strr):` ` ` ` ` `# hash to store frequency of each character` ` ` `# to set hash array to zeros` ` ` `hash` `=` `[` `0` `] ` `*` `26` ` ` `# count frequency of each character` ` ` `for` `char ` `in` `strr:` ` ` `hash` `[` `ord` `(char)` `-` `ord` `(` `'a'` `)] ` `=` `hash` `[` `ord` `(char)` `-` `ord` `(` `'a'` `)] ` `+` `1` ` ` `# count the odd frequency characters` ` ` `count ` `=` `0` ` ` `for` `i ` `in` `range` `(` `26` `):` ` ` `if` `hash` `[i]` `%` `2` `:` ` ` `count ` `=` `count ` `+` `1` ` ` `# if count is 0, return 0` ` ` `# otherwise return count` ` ` `return` `0` `if` `count ` `=` `=` `0` `else` `count` `-` `1` `# Driver's Code` `if` `__name__ ` `=` `=` `"__main__"` `:` ` ` ` ` `strr ` `=` `"geeksforgeeks"` `;` ` ` `# minRemoval to find minimum characters to remove` ` ` `print` `(minRemoval(strr))` |

## C#

`// C# Program to find minimum number of` `// removal to make any permutation of` `// the string a palindrome` `using` `System;` `class` `GFG {` ` ` ` ` `static` `int` `MAX_CHAR = 26;` ` ` ` ` `// function to find minimum removal` ` ` `// of characters` ` ` `static` `int` `minRemoval(` `string` `str) {` ` ` ` ` `// hash to store frequency of` ` ` `// each character` ` ` `int` `[]hash = ` `new` `int` `[MAX_CHAR];` ` ` ` ` `// to set hash array to zeros` ` ` `for` `(` `int` `i = 0; i < MAX_CHAR; i++)` ` ` `hash[i] = 0;` ` ` ` ` `// count frequency of each character` ` ` `for` `(` `int` `i = 0; i < str.Length; i++)` ` ` `hash[str[i] - ` `'a'` `]++;` ` ` ` ` `// count the odd frequency characters` ` ` `int` `count = 0;` ` ` `for` `(` `int` `i = 0; i < MAX_CHAR; i++)` ` ` `if` `(hash[i] % 2 == 1)` ` ` `count++;` ` ` ` ` `// if count is -1 return 0` ` ` `// otherwise return count` ` ` `return` `(count == 0) ? 0 : count - 1;` ` ` `}` ` ` ` ` `// Driver code` ` ` `public` `static` `void` `Main() {` ` ` `string` `str = ` `"geeksforgeeks"` `;` ` ` `Console.Write(minRemoval(str));` ` ` `}` `}` `// This code is contributed by nitin mittal` |

## PHP

`<?php` `// PHP Program to find minimum` `// number of removal to make any` `// permutation of the string a palindrome` `// function to find minimum` `// removal of characters` `function` `minRemoval(` `$str` `)` `{` ` ` ` ` `// hash to store frequency of each` ` ` `// character and to set hash array to zeros` ` ` `$hash` `= ` `array_fill` `(0, 26, 0);` ` ` ` ` `// count frequency of each character` ` ` `for` `(` `$i` `= 0; ` `$i` `< ` `strlen` `(` `$str` `); ` `$i` `++)` ` ` `$hash` `[ord(` `$str` `[` `$i` `]) - 97]++;` ` ` ` ` `// count the odd frequency characters` ` ` `$count` `= 0;` ` ` `for` `(` `$i` `= 0; ` `$i` `< 26; ` `$i` `++)` ` ` `if` `(` `$hash` `[` `$i` `] % 2)` ` ` `$count` `++;` ` ` ` ` `// if count is -1 return 0` ` ` `// otherwise return count` ` ` `return` `(` `$count` `== 0) ? 0 : ` `$count` `-1;` `}` `// Driver Code` `$str` `= ` `"geeksforgeeks"` `;` `echo` `minRemoval(` `$str` `).` `"\n"` `;` `// This code is contributed by mits` `?>` |

## Javascript

`<script>` `// Javascript Program to find minimum number of removal to` `// make any permutation of the string a palindrome` `var` `MAX_CHAR = 26` `// function to find minimum removal of characters` `function` `minRemoval( str)` `{` ` ` `// hash to store frequency of each character` ` ` `var` `hash = Array(MAX_CHAR).fill(0);` ` ` `// count frequency of each character` ` ` `for` `(` `var` `i = 0; str[i]; i++)` ` ` `hash[str[i].charCodeAt(0) - ` `'a'` `.charCodeAt(0)]++;` ` ` `// count the odd frequency characters` ` ` `var` `count = 0;` ` ` `for` `(` `var` `i = 0; i < MAX_CHAR; i++)` ` ` `if` `(hash[i] % 2)` ` ` `count++;` ` ` `// if count is -1 return 0` ` ` `// otherwise return count` ` ` `return` `(count == 0) ? 0 : count-1;` `}` `// Driver's Code` `var` `str = ` `"geeksforgeeks"` `;` `document.write( minRemoval(str));` `// This code is contributed by itsok.` `</script>` |

**Output :**

2