Open In App
Related Articles

Lexicographically smallest string formed by removing at most one character

Improve Article
Improve
Save Article
Save
Like Article
Like

Given a string str, the task is to find the lexicographically smallest string that can be formed by removing at most one character from the given string. 

Examples: 

Input: str = "abcda"  
Output: abca
One can remove 'd' to get "abca" which is 
the lexicographically smallest string possible. 

Input: str = "aaa' 
Output: aa

Approach: Traverse the string and delete the i-th character at the first point where s[i]>s[i+1]. If in case there is no such character then delete the last character in the string. 

Below is the implementation of the above approach: 

C++




// C++ program to find the lexicographically
// smallest string by removing at most one character
#include <bits/stdc++.h>
using namespace std;
 
// Function to return the smallest string
string smallest(string s)
{
    int l = s.length();
      bool flag=false; //to check if we can get lexicographically smallest string by removing one character
    string ans = ""; // to store resultant string
      int index=-1;// to store index required to be deleted
    for (int i = 0; i < l-1; i++) {
        // first point where s[i]>s[i+1]
        if (s[i] > s[i + 1]) {
          flag=true;
          index=i;
          break;
        }
    }
      if(flag==false)
    {
      ans=s;
      return ans;
    }
    //Storing resultant string
      for (int j = 0; j < l; j++) {
         if (index != j)
           ans += s[j];
           }
    return ans;
}
 
// Driver Code
int main()
{
    string s = "abcda";
    cout << smallest(s);
    return 0;
}


Java




// Java program to find the lexicographically
// smallest String by removing at most one character
 
class GFG {
 
// Function to return the smallest String
    static String smallest(String s) {
        int l = s.length();
        String ans = "";
 
        // iterate the String
        for (int i = 0; i < l-1; i++) {
 
            // first point where s[i]>s[i+1]
            if (s.charAt(i) > s.charAt(i + 1)) {
 
                // append the String without
                // i-th character in it
                for (int j = 0; j < l; j++) {
                    if (i != j) {
                        ans += s.charAt(j);
                    }
                }
                return ans;
            }
        }
 
        // leave the last character
        ans = s.substring(0, l - 1);
        return ans;
    }
 
// Driver Code
    public static void main(String[] args) {
 
        String s = "abcda";
        System.out.println(smallest(s));
    }
}
/* This code is contributed by 29AjayKumar*/


Python3




# Python3 program to find the lexicographically
# smallest string by removing at most one character
 
# Function to return the smallest string
def smallest(s):
 
    l = len(s)
    ans = ""
 
    # iterate the string
    for i in range (l-1):
 
        # first point where s[i]>s[i+1]
        if (s[i] > s[i + 1]):
 
            # append the string without
            # i-th character in it
            for j in range (l):
                if (i != j):
                    ans += s[j]
             
            return ans
 
    # leave the last character
    ans = s[0: l - 1]
    return ans
 
# Driver Code
if __name__ == "__main__":
 
    s = "abcda"
 
    print (smallest(s))
 
# This code is contributed by ita_c


C#




// C# program to find the lexicographically
// smallest String by removing at most
// one character
using System;
 
class GFG
{
 
// Function to return the
// smallest String
static String smallest(String s)
{
    int l = s.Length;
    String ans = "";
 
    // iterate the String
    for (int i = 0; i < l-1; i++)
    {
 
        // first point where s[i]>s[i+1]
        if (s[i] > s[i + 1])
        {
 
            // append the String without
            // i-th character in it
            for (int j = 0; j < l; j++)
            {
                if (i != j)
                {
                    ans += s[j];
                }
            }
            return ans;
        }
    }
 
    // leave the last character
    ans = s.Substring(0, l - 1);
    return ans;
}
 
// Driver Code
public static void Main()
{
    String s = "abcda";
    Console.Write(smallest(s));
}
}
 
// This code is contributed by 29AjayKumar


Javascript




<script>
// Javascript program to find the lexicographically
// smallest String by removing at most one character
     
    // Function to return the smallest String
    function smallest(s)
    {
        let l = s.length;
        let ans = "";
  
        // iterate the String
        for (let i = 0; i < l-1; i++)
        {
  
            // first point where s[i]>s[i+1]
            if (s[i] > s[i+1]) {
  
                // append the String without
                // i-th character in it
                for (let j = 0; j < l; j++) {
                    if (i != j) {
                        ans += s[j];
                    }
                }
                return ans;
            }
        }
  
        // leave the last character
        ans = s.substring(0, l - 1);
        return ans;
    }
     
    // Driver Code
    let s = "abcda";
    document.write(smallest(s));
 
// This code is contributed by rag2127
</script>


Output

abca

Complexity Analysis:

  • Time complexity: O(n) where n is the length of the string
  • Auxiliary Space: O(n) since we are storing the answer in form of string.

Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!

Last Updated : 08 Nov, 2022
Like Article
Save Article
Previous
Next
Similar Reads
Complete Tutorials