Given a string S and two integers N and K, the task is to find the maximum length suffix such that the occurrence of each character in the suffix string is less than N, and at most K elements can be deleted from the input string to get maximum length suffix.
Examples:
Input: S = “iahagafedcba”, N = 1, K = 0
Output: fedcba
Explanation:
Maximum length suffix in the given string
Such that occurrence of each character is 1 is “fedcba”,
Because if we take the string “afedcba”,
then the occurrence of character “a” will be 2.Input: S = “iahagafedcba”, N = 1, K = 2
Output: hgfedcba
Explanation:
Maximum length suffix in the given string
Such that occurrence of each character is 1 is “hgfedcba”,
After deleting character “a” two times.
Approach: The idea is to use hash-map to store the frequency of the characters of the string.
- Initialize an empty string to store the longest suffix of the string.
- Iterate the string from last using a loop –
- Increment the occurrence of the character by 1 in the hash-map
- If the occurrence of current character is less than N, then add the character into the suffix string
- Otherwise, decrement the value of K by 1 if the value of K is greater than 0
- Print the suffix string.
Below is the implementation of the above approach:
// C++ implementation to find // longest suffix of the string // such that occurrence of each // character is less than K #include <bits/stdc++.h> using namespace std;
// Function to find the maximum // length suffix in the string void maximumSuffix(string s,
int n, int k){
// Length of the string
int i = s.length() - 1;
// Map to store the number
// of occurrence of character
int arr[26] = { 0 };
string suffix = "" ;
// Loop to iterate string
// from the last character
while (i > -1) {
int index = s[i] - 'a' ;
// Condition to check if the
// occurrence of each character
// is less than given number
if (arr[index] < n) {
arr[index]++;
suffix += s[i];
i--;
continue ;
}
// Condition when character
// cannot be deleted
if (k == 0)
break ;
k--;
i--;
}
reverse(suffix.begin(), suffix.end());
// Longest suffix
cout << suffix;
} // Driver Code int main()
{ string str = "iahagafedcba" ;
int n = 1, k = 2;
// Function call
maximumSuffix(str, n, k);
return 0;
} |
// Java implementation to find // longest suffix of the String // such that occurrence of each // character is less than K public class GFG{
// Function to find the maximum // length suffix in the String static void maximumSuffix(String s,
int n, int k){
// Length of the String
int i = s.length() - 1 ;
// Map to store the number
// of occurrence of character
int arr[] = new int [ 26 ];
String suffix = "" ;
// Loop to iterate String
// from the last character
while (i > - 1 ) {
int index = s.charAt(i) - 'a' ;
// Condition to check if the
// occurrence of each character
// is less than given number
if (arr[index] < n) {
arr[index]++;
suffix += s.charAt(i);
i--;
continue ;
}
// Condition when character
// cannot be deleted
if (k == 0 )
break ;
k--;
i--;
}
suffix = reverse(suffix);
// Longest suffix
System.out.print(suffix);
} static String reverse(String input) {
char [] a = input.toCharArray();
int l, r = a.length - 1 ;
for (l = 0 ; l < r; l++, r--) {
char temp = a[l];
a[l] = a[r];
a[r] = temp;
}
return String.valueOf(a);
} // Driver Code public static void main(String[] args)
{ String str = "iahagafedcba" ;
int n = 1 , k = 2 ;
// Function call
maximumSuffix(str, n, k);
} } // This code is contributed by 29AjayKumar |
# Python 3 implementation to find # longest suffix of the string # such that occurrence of each # character is less than K # Function to find the maximum # length suffix in the string def maximumSuffix(s, n, k):
# Length of the string
i = len (s) - 1
# Map to store the number
# of occurrence of character
arr = [ 0 for i in range ( 26 )]
suffix = ""
# Loop to iterate string
# from the last character
while (i > - 1 ):
index = ord (s[i]) - ord ( 'a' );
# Condition to check if the
# occurrence of each character
# is less than given number
if (arr[index] < n):
arr[index] + = 1
suffix + = s[i]
i - = 1
continue
# Condition when character
# cannot be deleted
if (k = = 0 ):
break
k - = 1
i - = 1
suffix = suffix[:: - 1 ]
# Longest suffix
print (suffix)
# Driver Code if __name__ = = '__main__' :
str = "iahagafedcba"
n = 1
k = 2
# Function call
maximumSuffix( str , n, k)
# This code is contributed by Surendra_Gangwar |
// C# implementation to find // longest suffix of the String // such that occurrence of each // character is less than K using System;
class GFG{
// Function to find the maximum // length suffix in the String static void maximumSuffix(String s,
int n, int k){
// Length of the String
int i = s.Length - 1;
// Map to store the number
// of occurrence of character
int []arr = new int [26];
String suffix = "" ;
// Loop to iterate String
// from the last character
while (i > -1) {
int index = s[i] - 'a' ;
// Condition to check if the
// occurrence of each character
// is less than given number
if (arr[index] < n) {
arr[index]++;
suffix += s[i];
i--;
continue ;
}
// Condition when character
// cannot be deleted
if (k == 0)
break ;
k--;
i--;
}
suffix = reverse(suffix);
// longest suffix
Console.Write(suffix);
} static String reverse(String input) {
char [] a = input.ToCharArray();
int l, r = a.Length - 1;
for (l = 0; l < r; l++, r--) {
char temp = a[l];
a[l] = a[r];
a[r] = temp;
}
return String.Join( "" ,a);
} // Driver Code public static void Main(String[] args)
{ String str = "iahagafedcba" ;
int n = 1, k = 2;
// Function call
maximumSuffix(str, n, k);
} } // This code is contributed by Rajput-Ji |
<script> // JavaScript implementation to find // longest suffix of the string // such that occurrence of each // character is less than K // Function to find the maximum // length suffix in the string function maximumSuffix(s,n, k){
// Length of the string
let i = s.length - 1;
// Map to store the number
// of occurrence of character
let arr = new Array(26).fill(0);
let suffix = "" ;
// Loop to iterate string
// from the last character
while (i > -1) {
let index = s.charCodeAt(i) - 97;
// Condition to check if the
// occurrence of each character
// is less than given number
if (arr[index] < n) {
arr[index]++;
suffix += s[i];
i--;
continue ;
}
// Condition when character
// cannot be deleted
if (k == 0)
break ;
k--;
i--;
}
suffix = suffix.split( "" ).reverse().join( "" );
// Longest suffix
document.write(suffix);
} // Driver Code let str = "iahagafedcba" ;
let n = 1, k = 2; // Function call maximumSuffix(str, n, k); // This code is contributed by shinjanpatra. </script> |
hgfedcba
Performance Analysis:
- Time Complexity: In the above-given approach, there is one loop for iterating over string which takes O(L) time in worst case. Therefore, the time complexity for this approach will be O(L).
- Auxiliary Space Complexity: In the above-given approach, there is extra space used to store the frequency of the character. Therefore, the auxiliary space complexity for the above approach will be O(L)