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.



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

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

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

chevron_right


Python

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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))

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

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

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

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

chevron_right



Output :

2


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : Mithun Kumar, nitin mittal



Article Tags :
Practice Tags :


Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.