Lexicographically largest possible String after removal of K characters

• Difficulty Level : Hard
• Last Updated : 27 May, 2021

Given a string S consisting of only lowercase letters, the task is to find the lexicographically largest string that can be obtained by removing K characters from the given string.

Examples:

Input: s = “zyxedcba”, K=1
Output: zyxedcb
Explanation: The character with the smallest ASCII value from the given string is ‘a’.
Removal of ‘a’ generates the lexicographically largest possible string.

Input: s = “abcde”, K=2
Output: cde

Approach:
The idea is to use Stack Data Structure it to solve the problem. Follow the steps below to solve the problem:

• Traverse the string.
• For every character, check if it is greater than the character at the top of the stack. If found to be true, pop the top element of the stack if K > 0.
• Insert the character into the stack.
• After completing the traversal of the string, if K > 0, then remove the top K elements of the stack.
• Finally, store the characters in the stack as the answer. Print the answer.

Below is the implementation of the above approach:

C++

 // C++ Program to implement the// above approach#include using namespace std; string largestString(string num, int k){    // final result string    string ans = "";     for (auto i : num) {         // If the current char exceeds the        // character at the top of the stack        while (ans.length() && ans.back() < i               && k > 0) {             // Remove from the end of the string            ans.pop_back();             // Decrease k for the removal            k--;        }         // Insert current character        ans.push_back(i);    }     // Perform remaining K deletions    // from the end of the string    while (ans.length() and k--) {        ans.pop_back();    }     // Return the string    return ans;} // Driver Codeint main(){    string str = "zyxedcba";    int k = 1;     cout << largestString(str, k) << endl;}

Java

 // Java program to implement the// above approachclass GFG{ static String largestString(String num, int k){         // Final result String    String ans = "";     for(char i : num.toCharArray())    {                 // If the current char exceeds the        // character at the top of the stack        while (ans.length() > 0 &&               ans.charAt(ans.length() - 1) < i &&                                          k > 0)        {                         // Remove from the end of the String            ans = ans.substring(0, ans.length() - 1);             // Decrease k for the removal            k--;        }         // Insert current character        ans += i;    }     // Perform remaining K deletions    // from the end of the String    while (ans.length() > 0 && k-- > 0)    {        ans = ans.substring(0, ans.length() - 1);    }         // Return the String    return ans;} // Driver Codepublic static void main(String[] args){    String str = "zyxedcba";    int k = 1;     System.out.print(largestString(str, k) + "\n");}} // This code is contributed by 29AjayKumar

Python3

 # Python3 program to implement the# above approachdef largestString(num, k):         # Final result string    ans = []         for i in range(len(num)):                 # If the current char exceeds the        # character at the top of the stack        while(len(ans) and ans[-1] < num[i] and                                 k > 0):                         # Remove from the end of the string            ans.pop()                         # Decrease k for the removal            k -= 1                 # Insert current character        ans.append(num[i])         # Perform remaining K deletions    # from the end of the string    while(len(ans) and k):        k -= 1        ans.pop()         # Return the string    return ans     # Driver codestr = "zyxedcba"k = 1 print(*largestString(str, k), sep = "") # This code is contributed by divyeshrabadiya07

C#

 // C# program to implement the// above approachusing System; class GFG{ static String largestString(String num, int k){         // Final result String    String ans = "";     foreach(char i in num.ToCharArray())    {                 // If the current char exceeds the        // character at the top of the stack        while (ans.Length > 0 &&           ans[ans.Length - 1] < i && k > 0)        {                         // Remove from the end of the String            ans = ans.Substring(0, ans.Length - 1);             // Decrease k for the removal            k--;        }         // Insert current character        ans += i;    }     // Perform remaining K deletions    // from the end of the String    while (ans.Length > 0 && k-- > 0)    {        ans = ans.Substring(0, ans.Length - 1);    }         // Return the String    return ans;} // Driver Codepublic static void Main(String[] args){    String str = "zyxedcba";    int k = 1;     Console.Write(largestString(str, k) + "\n");}} // This code is contributed by 29AjayKumar

Javascript


Output:
zyxedcb

Time Complexity: O(N)
Auxiliary Space: O(N)

My Personal Notes arrow_drop_up