Skip to content
Related Articles
Get the best out of our app
GeeksforGeeks App
Open App
geeksforgeeks
Browser
Continue

Related Articles

Lexicographically smallest string formed by removing at most one character

Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article

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.

My Personal Notes arrow_drop_up
Last Updated : 08 Nov, 2022
Like Article
Save Article
Similar Reads
Related Tutorials