Longest subsequence where every character appears at-least k times

22 Jun, 2022
Given a string and a number k, find the longest subsequence of a string where every character appears at-least k times.
Examples: 
Input : str = "geeksforgeeks"
         k = 2
Output : geeksgeeks
Every character in the output
subsequence appears at-least 2
times.

Input : str = "aabbaabacabb"
          k = 5
Output : aabbaabaabb
Method 1 (Brute force) We generate all subsequences. For every subsequence count distinct characters in it and find the longest subsequence where every character appears at-least k times.
Method 2 (Efficient way) 1. Find the frequency of the string and store it in an integer array of size 26 representing the alphabets. 2. After finding the frequency iterate the string character by character and if the frequency of that character is greater than or equal to the required number of repetitions then print that character then and there only. 
C++
Java
Python3
C#
Javascript
// C++ program to Find longest subsequence where//  every character appears at-least k times#include<bits/stdc++.h>using namespace std; const int MAX_CHARS = 26; void longestSubseqWithK(string str, int k)   {    int n = str.size();                       // Count frequencies of all characters    int freq[MAX_CHARS] = {0};                       for (int i = 0 ; i < n; i++)           freq[str[i] - 'a']++;                      // Traverse given string again and print    // all those characters whose frequency    // is more than or equal to k.    for (int i = 0 ; i < n ; i++)          if (freq[str[i] - 'a'] >= k)                          cout << str[i];     } // Driver codeint main() {    string str = "geeksforgeeks";    int k = 2;    longestSubseqWithK(str, k);          return 0;}
// Java program to Find longest subsequence where//  every character appears at-least k times class GFG {     static final int MAX_CHARS = 26;     static void longestSubseqWithK(String str, int k) {        int n = str.length();         // Count frequencies of all characters        int freq[] = new int[MAX_CHARS];        for (int i = 0; i < n; i++) {            freq[str.charAt(i) - 'a']++;        }         // Traverse given string again and print        // all those characters whose frequency        // is more than or equal to k.        for (int i = 0; i < n; i++) {            if (freq[str.charAt(i) - 'a'] >= k) {                System.out.print(str.charAt(i));            }        }    } // Driver code    static public void main(String[] args) {        String str = "geeksforgeeks";        int k = 2;        longestSubseqWithK(str, k);     }} // This code is contributed by Rajput-Ji
# Python3 program to Find longest subsequence where#  every character appears at-least k times  MAX_CHARS = 26  def longestSubseqWithK(s, k):        n = len(s)                       # Count frequencies of all characters    freq = [0]*MAX_CHARS                    for i in range(n):         freq[ord(s[i]) - ord('a')]+=1                       # Traverse given string again and print    # all those characters whose frequency    # is more than or equal to k.    for i in range(n ):        if (freq[ord(s[i]) - ord('a')] >= k):                          print(s[i],end="")  # Driver codeif __name__ == "__main__":         s = "geeksforgeeks"    k = 2    longestSubseqWithK(s, k)
     // C# program to Find longest subsequence where//  every character appears at-least k timesusing System;public class GFG {      static readonly int MAX_CHARS = 26;      static void longestSubseqWithK(String str, int k) {        int n = str.Length;          // Count frequencies of all characters        int []freq = new int[MAX_CHARS];        for (int i = 0; i < n; i++) {            freq[str[i]- 'a']++;        }          // Traverse given string again and print        // all those characters whose frequency        // is more than or equal to k.        for (int i = 0; i < n; i++) {            if (freq[str[i] - 'a'] >= k) {                Console.Write(str[i]);            }        }    }  // Driver code    static public void Main() {        String str = "geeksforgeeks";        int k = 2;        longestSubseqWithK(str, k);      }}  // This code is contributed by Rajput-Ji
<script> // Javascript program to find longest subsequence// where every character appears at-least k timeslet MAX_CHARS = 26; function longestSubseqWithK(str, k){    let n = str.length;     // Count frequencies of all characters    let freq = new Array(MAX_CHARS);    for(let i = 0; i < freq.length; i++)    {        freq[i] = 0    }         for(let i = 0; i < n; i++)    {        freq[str[i].charCodeAt(0) -                'a'.charCodeAt(0)]++;    }     // Traverse given string again and print    // all those characters whose frequency    // is more than or equal to k.    for(let i = 0; i < n; i++)    {        if (freq[str[i].charCodeAt(0) -                    'a'.charCodeAt(0)] >= k)        {            document.write(str[i]);        }    }} // Driver codelet str = "geeksforgeeks";let k = 2; longestSubseqWithK(str, k); // This code is contributed by avanitrachhadiya2155     </script>
geeksgeeks
This code has a time complexity of O(n) where n is the size of the string. 
Auxiliary Space: O(n), where n is the length of the string. This is because when string is passed to any function it is passed by value and creates a copy of itself in stack. 
Method 3 (Efficient way – Using HashMap) 
C++
Java
Python3
Javascript
// C++ program to Find longest subsequence where every// character appears at-least k times#include <bits/stdc++.h>using namespace std; void longestSubseqWithK(string str, int k){  int n = str.size();  map<char, int> hm;   // Count frequencies of all characters  for (int i = 0; i < n; i++) {    char c = str[i];    hm++;  }   // Traverse given string again and print  // all those characters whose frequency  // is more than or equal to k.  for (int i = 0; i < n; i++) {    char c = str[i];    if (hm >= k) {      cout << c;    }  }} // Driver codeint main(){  string str = "geeksforgeeks";  int k = 2;  longestSubseqWithK(str, k);   return 0;} // This code is contributed by rakeshsahni
/*package whatever //do not write package name here */// Java program to Find longest subsequence where every// character appears at-least k times import java.io.*;import java.util.HashMap; class GFG {     static void longestSubseqWithK(String str, int k)    {        int n = str.length();        HashMap<Character, Integer> hm = new HashMap<>();         // Count frequencies of all characters        for (int i = 0; i < n; i++) {            char c = str.charAt(i);            if (hm.containsKey(c))                hm.put(c, hm.get(c) + 1);            else                hm.put(c, 1);        }         // Traverse given string again and print        // all those characters whose frequency        // is more than or equal to k.        for (int i = 0; i < n; i++) {            char c = str.charAt(i);            if (hm.get(c) >= k) {                System.out.print(c);            }        }    }     // Driver code    static public void main(String[] args)    {        String str = "geeksforgeeks";        int k = 2;        longestSubseqWithK(str, k);    }} // This code is contributed by Chandan-Bedi
# Python3 program to Find longest subsequence where every# character appears at-least k timesdef longestSubseqWithK(Str, k):  n = len(Str)  hm = {}   # Count frequencies of all characters  for i in range(n):    c = Str[i]    if(c in hm):        hm += 1         else:        hm = 1   # Traverse given string again and print  # all those characters whose frequency  # is more than or equal to k.  for i in range(n):    c = Str[i]    if (hm >= k):      print(c,end="")     # Driver codeStr = "geeksforgeeks"k = 2longestSubseqWithK(Str, k) # This code is contributed by shinjanpatra
<script> // JavaScript program to Find longest subsequence where every// character appears at-least k timesfunction longestSubseqWithK(str, k){  let n = str.length;  let hm = new Map();   // Count frequencies of all characters  for (let i = 0; i < n; i++) {    let c = str[i];    if(hm.has(c)){        hm.set(c,hm.get(c)+1);    }    else hm.set(c,1);  }   // Traverse given string again and print  // all those characters whose frequency  // is more than or equal to k.  for (let i = 0; i < n; i++) {    let c = str[i];    if (hm.get(c) >= k) {      document.write(c);    }  }} // Driver codelet str = "geeksforgeeks";let k = 2;longestSubseqWithK(str, k); // This code is contributed by shinjanpatra<script>
geeksgeeks
Time complexity: O(n*log(n)). This is because the time complexity of inserting an element in map is O(log(n)).
Auxiliary Space: O(n), where n is the length of the string. This is because when string is passed to any function it is passed by value and creates a copy of itself in stack. 
YouTube<div class="player-unavailable"><h1 class="message">An error occurred.</h1><div class="submessage"><a href="https://www.youtube.com/watch?v=pSjFRi_v8iY" target="_blank">Try watching this video on www.youtube.com</a>, or enable JavaScript if it is disabled in your browser.</div></div>
This article is contributed by Mohak Agrawal. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
Rajput-Ji
ukasp
PranjalRanjan2
avanitrachhadiya2155
chandanbedi22
vikas0713
rakeshsahni
simmytarika5
shinjanpatra
anandkumarshivam2266
Strings
Strings
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Length of the longest substring without repeating characters
Top 50 String Coding Problems for Interviews
Reverse words in a given string
What is Data Structure: Types, Classifications and Applications
Print all the duplicates in the input string
Reverse string in Python (6 different ways)
Remove duplicates from a given string
stringstream in C++ and its Applications
Sort string of characters
Given a string, find its first non-repeating character