Print characters having prime frequencies in order of occurrence
Last Updated :
27 Feb, 2022
Given a string str containing only lowercase characters. The task is to print the characters having prime frequency in the order of their occurrence.
Note that repeated elements with prime frequencies are printed as many times as they occur in order of their occurrence.
Examples:
Input: str = “geeksforgeeks”
Output: gksgks
Character |
Frequency |
‘g’ |
2 |
‘e’ |
4 |
‘k’ |
2 |
‘s’ |
2 |
‘f’ |
1 |
‘o’ |
1 |
‘r’ |
1 |
‘g’, ‘k’ and ‘s’ are the only characters with prime frequencies.
Input: str = “aeroplane”
Output: aeae
Approach: Create a frequency array to store the frequency of each of the character of the given string str. Traverse the string str again and check whether the frequency of that character is prime using Sieve Of Eratosthenes.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define SIZE 26
void SieveOfEratosthenes( bool prime[], int p_size)
{
prime[0] = false ;
prime[1] = false ;
for ( int p = 2; p * p <= p_size; p++) {
if (prime[p]) {
for ( int i = p * 2; i <= p_size; i += p)
prime[i] = false ;
}
}
}
void printChar(string str, int n)
{
bool prime[n + 1];
memset (prime, true , sizeof (prime));
SieveOfEratosthenes(prime, str.length() + 1);
int freq[SIZE];
memset (freq, 0, sizeof (freq));
for ( int i = 0; i < n; i++)
freq[str[i] - 'a' ]++;
for ( int i = 0; i < n; i++) {
if (prime[freq[str[i] - 'a' ]]) {
cout << str[i];
}
}
}
int main()
{
string str = "geeksforgeeks" ;
int n = str.length();
printChar(str, n);
return 0;
}
|
Java
class GFG
{
static int SIZE = 26 ;
static void SieveOfEratosthenes( boolean []prime,
int p_size)
{
prime[ 0 ] = false ;
prime[ 1 ] = false ;
for ( int p = 2 ; p * p <= p_size; p++)
{
if (prime[p])
{
for ( int i = p * 2 ; i < p_size; i += p)
prime[i] = false ;
}
}
}
static void printChar(String str, int n)
{
boolean []prime = new boolean [n + 1 ];
for ( int i = 0 ; i < n + 1 ; i++)
prime[i] = true ;
SieveOfEratosthenes(prime, str.length() + 1 );
int []freq = new int [SIZE];
for ( int i = 0 ; i< SIZE; i++)
freq[i]= 0 ;
for ( int i = 0 ; i < n; i++)
freq[str.charAt(i) - 'a' ]++;
for ( int i = 0 ; i < n; i++)
{
if (prime[freq[str.charAt(i) - 'a' ]])
{
System.out.print(str.charAt(i));
}
}
}
public static void main(String[] args)
{
String str = "geeksforgeeks" ;
int n = str.length();
printChar(str, n);
}
}
|
Python3
SIZE = 26
from math import sqrt
def SieveOfEratosthenes(prime, p_size):
prime[ 0 ] = False
prime[ 1 ] = False
for p in range ( 2 , int (sqrt(p_size)), 1 ):
if (prime[p]):
for i in range (p * 2 , p_size, p):
prime[i] = False
def printChar( str , n):
prime = [ True for i in range (n + 1 )]
SieveOfEratosthenes(prime, len ( str ) + 1 )
freq = [ 0 for i in range (SIZE)]
for i in range (n):
freq[ ord ( str [i]) - ord ( 'a' )] + = 1
for i in range (n):
if (prime[freq[ ord ( str [i]) - ord ( 'a' )]]):
print ( str [i], end = "")
if __name__ = = '__main__' :
str = "geeksforgeeks"
n = len ( str )
printChar( str , n)
|
C#
using System;
class GFG
{
static int SIZE = 26;
static void SieveOfEratosthenes( bool [] prime,
int p_size)
{
prime[0] = false ;
prime[1] = false ;
for ( int p = 2; p * p <= p_size; p++)
{
if (prime[p])
{
for ( int i = p * 2;
i < p_size; i += p)
prime[i] = false ;
}
}
}
static void printChar( string str, int n)
{
bool [] prime = new bool [n + 1];
for ( int i = 0; i < n + 1; i++)
prime[i] = true ;
SieveOfEratosthenes(prime, str.Length + 1);
int [] freq = new int [SIZE];
for ( int i = 0; i < SIZE; i++)
freq[i] = 0;
for ( int i = 0; i < n; i++)
freq[str[i] - 'a' ]++;
for ( int i = 0; i < n; i++)
{
if (prime[freq[str[i] - 'a' ]])
{
Console.Write(str[i]);
}
}
}
public static void Main(String[] args)
{
String str = "geeksforgeeks" ;
int n = str.Length;
printChar(str, n);
}
}
|
Javascript
<script>
let SIZE = 26;
function SieveOfEratosthenes(prime, p_size){
prime[0] = false ;
prime[1] = false ;
for (let p = 2; p * p <= p_size; p++) {
if (prime[p]) {
for (let i = p * 2; i <= p_size; i += p)
prime[i] = false ;
}
}
return prime;
}
function printChar(str, n){
let prime = [];
for (let i = 0; i<n+1; i++){
prime.push( true );
}
prime = SieveOfEratosthenes(prime, str.length + 1);
let freq = [];
for (let i = 0; i<26; i++){
freq.push(0);
}
for (let i = 0; i < n; i++)
freq[str.charCodeAt(i) - 97]++;
for (let i = 0; i < n; i++) {
if (prime[freq[str.charCodeAt(i) - 97]]) {
document.write(str[i]);
}
}
}
let str = "geeksforgeeks" ;
let n = str.length;
printChar(str, n);
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(n)
Method #2: Using built-in functions:
Approach:
We will scan the string and count the occurrence of all characters using built-in Counter() function after that we traverse the string and check if the occurrences are prime or not if there is any prime frequency then we print it.
Note: This method is applicable for all type of characters
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
bool prime( int n)
{
if (n <= 1)
return false ;
int max_div = floor ( sqrt (n));
for ( int i = 2; i < 1 + max_div; i++) {
if (n % i == 0)
return false ;
}
return true ;
}
void checkString(string s)
{
unordered_map< char , int > freq;
for ( int i = 0; i < s.size(); i++) {
freq[s[i]]++;
}
for ( int i = 0; i < s.size(); i++) {
if (prime(freq[s[i]]))
cout << s[i];
}
}
int main()
{
string s = "geeksforgeeks" ;
checkString(s);
}
|
Java
import java.io.*;
import java.util.*;
class GFG {
static boolean prime( int n)
{
if (n <= 1 )
return false ;
int max_div = ( int )Math.floor(Math.sqrt(n));
for ( int i = 2 ; i < 1 + max_div; i++)
{
if (n % i == 0 )
return false ;
}
return true ;
}
static void checkString(String s)
{
Map<Character, Integer> freq = new HashMap<Character, Integer>();
for ( int i = 0 ; i < s.length(); i++)
{
if (!freq.containsKey(s.charAt(i)))
freq.put(s.charAt(i), 0 );
freq.put(s.charAt(i),freq.get(s.charAt(i))+ 1 );
}
for ( int i = 0 ; i < s.length(); i++)
{
if (prime(freq.get(s.charAt(i))))
System.out.print(s.charAt(i));
}
}
public static void main (String[] args) {
String s = "geeksforgeeks" ;
checkString(s);
}
}
|
Python3
from collections import Counter
import math
def prime(n):
if n < = 1 :
return False
max_div = math.floor(math.sqrt(n))
for i in range ( 2 , 1 + max_div):
if n % i = = 0 :
return False
return True
def checkString(s):
freq = Counter(s)
for i in range ( len (s)):
if prime(freq[s[i]]):
print (s[i], end = "")
s = "geeksforgeeks"
checkString(s)
|
C#
using System;
using System.Collections.Generic;
class GFG{
static bool prime( int n)
{
if (n <= 1)
return false ;
int max_div = ( int )Math.Floor(Math.Sqrt(n));
for ( int i = 2; i < 1 + max_div; i++)
{
if (n % i == 0)
return false ;
}
return true ;
}
static void checkString( string s)
{
Dictionary< char ,
int > freq = new Dictionary< char ,
int >();
for ( int i = 0; i < s.Length; i++)
{
if (!freq.ContainsKey(s[i]))
freq[s[i]] = 0;
freq[s[i]] += 1;
}
for ( int i = 0; i < s.Length; i++)
{
if (prime(freq[s[i]]))
Console.Write(s[i]);
}
}
public static void Main()
{
string s = "geeksforgeeks" ;
checkString(s);
}
}
|
Javascript
<script>
function prime(n)
{
if (n <= 1)
return false ;
let max_div = Math.floor(Math.sqrt(n));
for (let i = 2; i < 1 + max_div; i++)
{
if (n % i == 0)
return false ;
}
return true ;
}
function checkString(s)
{
let freq = new Map();
for (let i = 0; i < s.length; i++)
{
if (!freq.has(s[i]))
freq.set(s[i], 0);
freq.set(s[i], freq.get(s[i]) + 1);
}
for (let i = 0; i < s.length; i++)
{
if (prime(freq.get(s[i])))
document.write(s[i]);
}
}
let s = "geeksforgeeks" ;
checkString(s);
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(26)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...