 Open in App
Not now

# Modify string by sorting characters after removal of characters whose frequency is not equal to power of 2

• Last Updated : 21 Jun, 2022

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”

Approach: The given problem can be solved by using Hashing. Follow the steps below to solve the given problem:

Below is the implementation of the above approach:

## C++

 `// C++ program for the above approach` `#include ``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 = { 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``;``    ``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

 ``

Output:

`bbc`

Time Complexity: O(N)
Auxiliary Space: O(1)

My Personal Notes arrow_drop_up