Lexicographically largest string formed from the characters in range L and R
Given a string S and a range L and R, the task is to print the lexicographically largest string that can be formed from the characters in range L and R.
Examples:
Input: str = "thgyfh", L = 2, R = 6 Output: yhhgf Input: str = "striver", L = 3, R = 5 Output: vri
Approach:
- Iterate from min(L, R) to max(L, R) and increase the frequencies of characters in a freq[] array.
- Iterate from 25 to 0 and print the number of times every character occurs to get the lexicographically largest string.
The common point of mistake that everyone does is they iterate from L to R instead of min(L, R) to max(L, R).
Below is the implementation of the above approach:
C++
// C++ program to print the // lexicographically largest string that // can be formed from the characters // in range L and R #include <bits/stdc++.h> using namespace std; // Function to return the lexicographically largest string string printLargestString(string s, int l, int r) { // hash array int freq[26] = { 0 }; // make 0-based indexing l--; r--; // iterate and count frequencies of character for ( int i = min(l, r); i <= max(l, r); i++) { freq[s[i] - 'a' ]++; } // ans string string ans = "" ; // iterate in frequency array for ( int i = 25; i >= 0; i--) { // add till all characters // are added while (freq[i]) { ans += char ( 'a' + i); freq[i]--; } } return ans; } // Driver Code int main() { string s = "striver" ; int l = 3, r = 5; cout << printLargestString(s, l, r); return 0; } |
Java
// Java program to print the // lexicographically largest String that // can be formed from the characters // in range L and R class GFG { // Function to return the lexicographically largest String static String printLargestString(String s, int l, int r) { // hash array int freq[] = new int [ 26 ]; // make 0-based indexing l--; r--; // iterate and count frequencies of character for ( int i = Math.min(l, r); i <= Math.max(l, r); i++) { freq[s.charAt(i) - 'a' ]++; } // ans String String ans = "" ; // iterate in frequency array for ( int i = 25 ; i >= 0 ; i--) { // add till all characters // are added while (freq[i] > 0 ) { ans += ( char ) ( 'a' + i); freq[i]--; } } return ans; } // Driver Code public static void main(String[] args) { String s = "striver" ; int l = 3 , r = 5 ; System.out.println(printLargestString(s, l, r)); } } /* This JAVA code is contributed by 29AjayKumar*/ |
Python 3
# Python 3 program to print the # lexicographically largest string that # can be formed from the characters # in range L and R # Function to return the lexicographically # largest string def printLargestString(s, l, r): # hash array freq = [ 0 ] * 26 # make 0-based indexing l - = 1 r - = 1 # iterate and count frequencies of character for i in range ( min (l, r), max (l, r) + 1 ) : freq[ ord (s[i]) - ord ( 'a' )] + = 1 # ans string ans = "" # iterate in frequency array for i in range ( 25 , - 1 , - 1 ): # add till all characters are added while (freq[i]): ans + = chr ( ord ( 'a' ) + i) freq[i] - = 1 return ans # Driver Code if __name__ = = "__main__" : s = "striver" l = 3 r = 5 print (printLargestString(s, l, r)) # This code is contributed by ita_c |
C#
// C# program to print the lexicographically // largest String that can be formed from the // characters in range L and R using System; class GFG { // Function to return the lexicographically // largest String static String printLargestString(String s, int l, int r) { // hash array int []freq = new int [26]; // make 0-based indexing l--; r--; // iterate and count frequencies // of character for ( int i = Math.Min(l, r); i <= Math.Max(l, r); i++) { freq[s[i] - 'a' ]++; } // ans String String ans = "" ; // iterate in frequency array for ( int i = 25; i >= 0; i--) { // add till all characters // are added while (freq[i] > 0) { ans += ( char ) ( 'a' + i); freq[i]--; } } return ans; } // Driver Code public static void Main() { String s = "striver" ; int l = 3, r = 5; Console.Write(printLargestString(s, l, r)); } } // This code is contributed by 29AjayKumar |
Javascript
<script> // javascript program to print the // lexicographically largest String that // can be formed from the characters // in range L and R // Function to return the lexicographically largest String function printLargestString( s , l , r) { // hash array var freq = Array(26).fill(0); // make 0-based indexing l--; r--; // iterate and count frequencies of character for (i = Math.min(l, r); i <= Math.max(l, r); i++) { freq[s.charCodeAt(i) - 'a' .charCodeAt(0)]++; } // ans String var ans = "" ; // iterate in frequency array for ( var i = 25; i >= 0; i--) { // add till all characters // are added while (freq[i] > 0) { ans += String.fromCharCode( 'a' .charCodeAt(0) + i); freq[i]--; } } return ans; } // Driver Code var s = "striver" ; var l = 3, r = 5; document.write(printLargestString(s, l, r)); // This code is contributed by todaysgaurav </script> |
Output
vri
Complexity Analysis:
- Time Complexity: O(N), as we are using a loop to traverse N times for counting the frequencies.
Each element gets added to the frequency table only once which takes O(1) and is appended to string which also takes O(1). - Auxiliary Space: O(N), as we are using extra space for storing resultant string.
Please Login to comment...