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 = “neveropen”
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++
// 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
// 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
# 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#
// 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 |
Javascript
<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)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!