Open In App

Lexicographically smallest string formed by removing at most one character

Improve
Improve
Like Article
Like
Save
Share
Report

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.


Last Updated : 08 Nov, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads