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>
Output:
bbc
Time Complexity: O(N)
Auxiliary Space: O(1)