Minimum deletions from string to reduce it to string with at most 2 unique characters

Given a string S containing lowercase English alphabets. The task is to find the minimum number of characters needed to be removed so that the remaining string contains at most 2 unique characters.

Note: The final string can have duplicate characters. The task is only to reduce the string with minimum deletions such that there can be a maximum of 2 unique characters in the resultant string.

Examples:

Input: S = “geeksforgeeks”
Output: 7
After removing 7 characters the final string will be “geegee”

Input: S = “helloworld”
Output: 5

Approach: First count the occurrences of each character within the given string then just select two characters with maximum occurrence i.e. the two most frequently occurring characters in the string. And the result will be:

String length – (Occurrence of 1st most frequent character + Occurrence of 2nd most frequent character)

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the above approach
  
#include<bits/stdc++.h>
using namespace std;
  
// Function to find the minimum deletions
int check(string s)
{
      
    int i, j;
    // Array to store the occurrences 
    // of each characters
    int fr[26] = {0} ;
  
    // Length of the string
    int n = s.size() ;
    for(i = 0; i < n; i++)
    {
          
        // ASCII of the character
        char x = s[i] ;
          
        // Increasing the frequency for this character
        fr[x-'a'] += 1 ;
      
    }
  
  
    int minimum = INT_MAX;
  
    for(i = 0 ; i < 26; i++)
    {
        for( j = i + 1;j < 26; j++)
        {
  
            // Choosing two character
            int z = fr[i] + fr[j] ;
  
            // Finding the minimum deletion
            minimum = min(minimum, n - z) ;
        }
    }
  
    return minimum ;
}
  
/* Driver code */
int main()
{
    string s ="geeksforgeeks" ;
    cout << check(s) ;
}
  
// This code is contributed by ihritik

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the above approach
  
public class GFG{
  
// Function to find the minimum deletions
static int check(String s)
{
      
    int i,j;
    // Array to store the occurrences 
    // of each characters
    int fr[] = new int[26] ;
  
    // Length of the string
    int n = s.length() ;
    for(i = 0; i < n; i++)
    {
          
        // ASCII of the character
        char x = s.charAt(i) ;
          
        // Increasing the frequency for this character
        fr[x-'a'] += 1 ;
      
    }
  
  
    int minimum = Integer.MAX_VALUE;
  
    for(i = 0 ; i < 26; i++)
    {
        for( j = i + 1;j < 26; j++)
        {
  
            // Choosing two character
            int z = fr[i] + fr[j] ;
  
            // Finding the minimum deletion
            minimum = Math.min(minimum, n-z) ;
        }
    }
  
    return minimum ;
}
  
    /* Driver program to test above functions */
     public static void main(String []args){
              
        String s ="geeksforgeeks" ;
        System.out.println(check(s)) ;
  
        }
    // This code is contributed by ANKITRAI1
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 implementation of the above approach
  
# Function to find the minimum deletions
def check(s):
  
    # Array to store the occurrences 
    # of each characters
    fr =[0]*26
  
    # Length of the string
    n = len(s)
    for i in range(n):
  
        # ASCII of the character
        x = ord(s[i])
  
        # Increasing the frequency for this character
        fr[x-97] += 1
  
    minimum = 99999999999
  
    for i in range(26):
        for j in range(i + 1, 26):
  
            # Choosing two character
            z = fr[i] + fr[j]
  
            # Finding the minimum deletion
            minimum = min(minimum, n-z)
  
    return minimum
  
# Driver code
s ="geeksforgeeks"
print(check(s))

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the above approach
   
using System;
public class GFG{
   
// Function to find the minimum deletions
static int check(string s)
{
       
    int i,j;
    // Array to store the occurrences 
    // of each characters
    int[] fr = new int[26] ;
   
    // Length of the string
    int n = s.Length ;
    for(i = 0; i < n; i++)
    {
           
        // ASCII of the character
        char x = s[i] ;
           
        // Increasing the frequency for this character
        fr[x-'a'] += 1 ;
       
    }
   
   
    int minimum = int.MaxValue;
   
    for(i = 0 ; i < 26; i++)
    {
        for( j = i + 1;j < 26; j++)
        {
   
            // Choosing two character
            int z = fr[i] + fr[j] ;
   
            // Finding the minimum deletion
            minimum = Math.Min(minimum, n-z) ;
        }
    }
   
    return minimum ;
}
   
    /* Driver program to test above functions */
     public static void Main(){
               
        string s ="geeksforgeeks" ;
        Console.Write(check(s)) ;
   
        }
}

chevron_right


Output:

7

Time Complexity: O(N), where N is the length of the given String.



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 : AnkitRai01, Ita_c, ihritik



Article Tags :
Practice Tags :


1


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