Dada una string S que consta de N alfabetos en minúsculas, la tarea es eliminar los caracteres de la string cuya frecuencia no es una potencia de 2 y luego ordenar la string en orden ascendente .
Ejemplos:
Entrada: S = “aaacbb”
Salida: bbc
Explicación: Las frecuencias de ‘a’, ‘b’ y ‘c’ en la string dada son 3, 2, 1. Solo el carácter ‘a’ tiene frecuencia (= 3) que no es una potencia de 2. Por lo tanto, eliminar ‘a’ de la string S la modifica a «cbb». Por lo tanto, la string modificada después de la clasificación es «bbc».Entrada: S = «geeksforgeeks»
Salida: eeeefggkkorss
Enfoque: El problema dado se puede resolver usando Hashing . Siga los pasos a continuación para resolver el problema dado:
- Inicialice una array auxiliar de tamaño 26 , digamos freq[] , para almacenar la frecuencia de cada carácter en la string S de modo que el índice 0 represente el carácter ‘a’ , 1 represente el carácter ‘b’ , y así sucesivamente.
- Recorre la string S dada e incrementa la frecuencia de cada carácter S[i] en 1 en la array freq[] .
- Recorra la array freq[] y si el valor de freq[i] es una potencia de 2 , imprima el carácter (‘a’ + i), freq[i] varias veces.
A continuación se muestra la implementación del enfoque anterior:
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
Complejidad temporal: O(N)
Espacio auxiliar: O(1)