Given a string S consisting of N lowercase alphabets, the task is to remove the characters from the string whose frequency is not a power of 2 and then sort the string in ascending order.
Examples:
Input: S = “aaacbb”
Output: bbc
Explanation: The frequencies of ‘a’, ‘b’, and ‘c’ in the given string are 3, 2, 1. Only the character ‘a’ has frequency (= 3) which is not a power of 2. Therefore, removing ‘a’ from the string S modifies it to “cbb”. Therefore, the modified string after sorting is “bbc”.Input: S = “geeksforgeeks”
Output: eeeefggkkorss
Approach: The given problem can be solved by using Hashing. Follow the steps below to solve the given problem:
- Initialize an auxiliary array of size 26, say freq[], to store the frequency of each character in the string S such that index 0 represents character ‘a’, 1 represents the character ‘b’, and so on.
- Traverse the given string S and increment the frequency of each character S[i] by 1 in the array freq[].
- Traverse the array freq[] and if the value of freq[i] is a power of 2, then print the character (‘a’ + i), freq[i] number of times.
Below is the implementation of the above approach:
// C++ program for the above approach #include <bits/stdc++.h> using namespace std;
// Function to remove all the characters // from a string that whose frequencies // are not equal to a perfect power of 2 void countFrequency(string S, int N)
{ // Stores the frequency of
// each character in S
int freq[26] = { 0 };
// Iterate over characters of string
for ( int i = 0; i < N; i++) {
// Update frequency of current
// character in the array freq[]
freq[S[i] - 'a' ]++;
}
// Traverse the array freq[]
for ( int i = 0; i < 26; i++) {
// Check if the i-th letter
// is absent from string S
if (freq[i] == 0)
continue ;
// Calculate log of frequency
// of the current character
// in the string S
int lg = log2(freq[i]);
// Calculate power of 2 of lg
int a = pow (2, lg);
// Check if freq[i]
// is a power of 2
if (a == freq[i]) {
// Print letter i + 'a'
// freq[i] times
while (freq[i]--)
cout << ( char )(i + 'a' );
}
}
} // Driver Code int main()
{ string S = "aaacbb" ;
int N = S.size();
countFrequency(S, N);
return 0;
} |
// Java program for the above approach class GFG{
// Function to remove all the characters // from a string that whose frequencies // are not equal to a perfect power of 2 static void countFrequency(String S, int N)
{ // Stores the frequency of
// each character in S
int []freq = new int [ 26 ];
//Array.Clear(freq, 0, freq.Length);
// Iterate over characters of string
for ( int i = 0 ; i < N; i++)
{
// Update frequency of current
// character in the array freq[]
freq[( int )S.charAt(i) - 'a' ] += 1 ;
}
// Traverse the array freq[]
for ( int i = 0 ; i < 26 ; i++)
{
// Check if the i-th letter
// is absent from string S
if (freq[i] == 0 )
continue ;
// Calculate log of frequency
// of the current character
// in the string S
int lg = ( int )(Math.log(freq[i]) / Math.log( 2 ));
// Calculate power of 2 of lg
int a = ( int )Math.pow( 2 , lg);
// Check if freq[i]
// is a power of 2
if (a == freq[i])
{
// Print letter i + 'a'
// freq[i] times
while (freq[i] > 0 )
{
freq[i] -= 1 ;
System.out.print(( char )(i + 'a' ));
}
}
}
} // Driver Code public static void main(String args[])
{ String S = "aaacbb" ;
int N = S.length();
countFrequency(S, N);
} } // This code is contributed by AnkThon |
# Python3 program for the above approach from math import log2
# Function to remove all the characters # from a that whose frequencies are not # equal to a perfect power of 2 def countFrequency(S, N):
# Stores the frequency of
# each character in S
freq = [ 0 ] * 26
# Iterate over characters of string
for i in range (N):
# Update frequency of current
# character in the array freq[]
freq[ ord (S[i]) - ord ( 'a' )] + = 1
# Traverse the array freq[]
for i in range ( 26 ):
# Check if the i-th letter
# is absent from S
if (freq[i] = = 0 ):
continue
# Calculate log of frequency
# of the current character
# in the S
lg = int (log2(freq[i]))
# Calculate power of 2 of lg
a = pow ( 2 , lg)
# Check if freq[i]
# is a power of 2
if (a = = freq[i]):
# Print letter i + 'a'
# freq[i] times
while (freq[i]):
print ( chr (i + ord ( 'a' )), end = "")
freq[i] - = 1
# Driver Code if __name__ = = '__main__' :
S = "aaacbb"
N = len (S)
countFrequency(S, N)
# This code is contributed by mohit kumar 29 |
// C# program for the above approach using System;
using System.Collections.Generic;
class GFG{
// Function to remove all the characters // from a string that whose frequencies // are not equal to a perfect power of 2 static void countFrequency( string S, int N)
{ // Stores the frequency of
// each character in S
int []freq = new int [26];
Array.Clear(freq, 0, freq.Length);
// Iterate over characters of string
for ( int i = 0; i < N; i++)
{
// Update frequency of current
// character in the array freq[]
freq[( int )S[i] - 'a' ] += 1;
}
// Traverse the array freq[]
for ( int i = 0; i < 26; i++)
{
// Check if the i-th letter
// is absent from string S
if (freq[i] == 0)
continue ;
// Calculate log of frequency
// of the current character
// in the string S
int lg = ( int )Math.Log(( double )freq[i], 2.0);
// Calculate power of 2 of lg
int a = ( int )Math.Pow(2, lg);
// Check if freq[i]
// is a power of 2
if (a == freq[i])
{
// Print letter i + 'a'
// freq[i] times
while (freq[i] > 0)
{
freq[i] -= 1;
Console.Write(( char )(i + 'a' ));
}
}
}
} // Driver Code public static void Main()
{ string S = "aaacbb" ;
int N = S.Length;
countFrequency(S, N);
} } // This code is contributed by SURENDRA_GANGWAR |
<script> // JavaScript program for the above approach
// Function to remove all the characters
// from a string that whose frequencies
// are not equal to a perfect power of 2
function countFrequency(S, N)
{
// Stores the frequency of
// each character in S
var freq = new Array(26).fill(0);
// Iterate over characters of string
for ( var i = 0; i < N; i++)
{
// Update frequency of current
// character in the array freq[]
freq[S[i].charCodeAt(0) - "a" .charCodeAt(0)]++;
}
// Traverse the array freq[]
for ( var i = 0; i < 26; i++)
{
// Check if the i-th letter
// is absent from string S
if (freq[i] === 0) continue ;
// Calculate log of frequency
// of the current character
// in the string S
var lg = parseInt(Math.log2(freq[i]));
// Calculate power of 2 of lg
var a = Math.pow(2, lg);
// Check if freq[i]
// is a power of 2
if (a === freq[i])
{
// Print letter i + 'a'
// freq[i] times
while (freq[i]--)
document.write(String.fromCharCode(i + "a" .charCodeAt(0)));
}
}
}
// Driver Code
var S = "aaacbb" ;
var N = S.length;
countFrequency(S, N);
// This code is contributed by rdtank.
</script>
|
bbc
Time Complexity: O(N)
Auxiliary Space: O(1)