Skip to content
Related Articles

Related Articles

Lexicographical Maximum substring of string

View Discussion
Improve Article
Save Article
  • Difficulty Level : Medium
  • Last Updated : 17 Aug, 2022
View Discussion
Improve Article
Save Article

Given a string s we have to find the lexicographical maximum substring of a string

Examples: 

Input : s = "ababaa"
Output : babaa
Explanation : "babaa" is the maximum lexicographic substring formed from this string

Input : s = "asdfaa"
Output : sdfaa

The idea is simple, we traverse through all substrings. For every substring, we compare it with the current result and update the result if needed.

Below is the implementation:

C++




// CPP program to find the lexicographically
// maximum substring.
#include <bits/stdc++.h>
using namespace std;
 
string LexicographicalMaxString(string str)
{
    // loop to find the max lexicographic
    // substring in the substring array
    string mx = "";
    for (int i = 0; i < str.length(); ++i)
        mx = max(mx, str.substr(i));
 
    return mx;
}
 
// Driver code
int main()
{
    string str = "ababaa";
    cout << LexicographicalMaxString(str);
    return 0;
}


Java




// Java program to find the lexicographically
// maximum substring.
 
class GFG {
 
    static String LexicographicalMaxString(String str)
    {
        // loop to find the max lexicographic
        // substring in the substring array
        String mx = "";
        for (int i = 0; i < str.length(); ++i) {
            if (mx.compareTo(str.substring(i)) <= 0) {
                mx = str.substring(i);
            }
        }
 
        return mx;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        String str = "ababaa";
        System.out.println(LexicographicalMaxString(str));
    }
}
// This code is contributed by 29AjayKumar


Python3




# Python 3 program to find the
# lexicographically maximum substring.
def LexicographicalMaxString(str):
     
    # loop to find the max lexicographic
    # substring in the substring array
    mx = ""
    for i in range(len(str)):
        mx = max(mx, str[i:])
 
    return mx
 
# Driver code
if __name__ == '__main__':
    str = "ababaa"
    print(LexicographicalMaxString(str))
     
# This code is contributed by
# Sanjit_Prasad


C#




// C# program to find the lexicographically
// maximum substring.
 
using System;
public class GFG {
 
    static String LexicographicalMaxString(String str)
    {
        // loop to find the max lexicographic
        // substring in the substring array
        String mx = "";
        for (int i = 0; i < str.Length; ++i) {
            if (mx.CompareTo(str.Substring(i)) <= 0) {
                mx = str.Substring(i);
            }
        }
 
        return mx;
    }
 
    // Driver code
    public static void Main()
    {
        String str = "ababaa";
        Console.WriteLine(LexicographicalMaxString(str));
    }
}
 
// This code is contributed by 29AjayKumar


Javascript




<script>
 
// JavaScript program to find the lexicographically
// maximum substring.
   function LexicographicalMaxString(str)
    {
        // loop to find the max lexicographic
    // substring in the substring array
    var mx = "";
    for (var i = 0; i < str.length; ++i) {
        if (mx.localeCompare(str.substring(i)) <= 0) {
            mx = str.substring(i);
        }
    }
 
    return mx;
}
 
// Driver code
   var str = "ababaa";
   document.write(LexicographicalMaxString(str));
 
// This code is contributed by 29AjayKumar
 
</script>


Output

babaa

Complexity Analysis:

  • Time complexity : O(n2
  • Auxiliary Space : O(n)

Optimization: We find the largest character and all its indexes. Now we simply traverse through all instances of the largest character to find lexicographically maximum substring.

Here we follow the above approach. 

C++




// C++ program to find the lexicographically
// maximum substring.
#include <bits/stdc++.h>
using namespace std;
 
string LexicographicalMaxString(string str)
{
    char maxchar = 'a';
    vector<int> index;
 
    // We store all the indexes of maximum
    // characters we have in the string
    for (int i = 0; i < str.length(); i++) {
        if (str[i] >= maxchar) {
            maxchar = str[i];
            index.push_back(i);
        }
    }
    string maxstring = "";
 
    // We form a substring from that maximum
    // character index till end and check if
    // its greater that maxstring
    for (int i = 0; i < index.size(); i++) {
        if (str.substr(index[i], str.length()) > maxstring) {
            maxstring = str.substr(index[i], str.length());
        }
    }
    return maxstring;
}
 
// Driver code
int main()
{
    string str = "acbacbc";
    cout << LexicographicalMaxString(str);
    return 0;
}


Java




// Java program to find the lexicographically
// maximum substring.
import java.io.*;
import java.util.*;
class GFG
{   
  static String LexicographicalMaxString(String str)
  {
    char maxchar = 'a';
    ArrayList<Integer> index = new ArrayList<Integer>();
 
    // We store all the indexes of maximum
    // characters we have in the string
    for (int i = 0; i < str.length(); i++)
    {
      if (str.charAt(i) >= maxchar)
      {
        maxchar = str.charAt(i);
        index.add(i);
      }
    }
    String maxstring = "";
 
    // We form a substring from that maximum
    // character index till end and check if
    // its greater that maxstring
    for (int i = 0; i < index.size(); i++)
    {
      if (str.substring(index.get(i),
                        str.length()).compareTo( maxstring) > 0)
      {
        maxstring = str.substring(index.get(i),
                                  str.length());
      }
    }
    return maxstring;
  }
 
  // Driver code
  public static void main (String[] args)
  {   
    String str = "acbacbc";  
    System.out.println(LexicographicalMaxString(str));
  }
}
 
// This code is contributed by rag2127.


Python3




# Python 3 program to find
# the lexicographically
# maximum substring.
def LexicographicalMaxString(st):
 
    maxchar = 'a'
    index = []
 
    # We store all the indexes
    # of maximum characters we
    # have in the string
    for i in range(len(st)):
        if (st[i] >= maxchar):
            maxchar = st[i]
            index.append(i)
 
    maxstring = ""
 
    # We form a substring from that
    # maximum character index till
    # end and check if its greater
    # that maxstring
    for i in range(len(index)):
        if (st[index[i]: len(st)] >
            maxstring):
            maxstring = st[index[i]:
                        len(st)]
    return maxstring
 
# Driver code
if __name__ == "__main__":
 
    st = "acbacbc"
    print(LexicographicalMaxString(st))
 
# This code is contributed by Chitranayal


C#




// C# program to find the lexicographically
// maximum substring.
using System;
using System.Collections.Generic;
 
class GFG{
     
static string LexicographicalMaxString(string str)
{
    char maxchar = 'a';
    List<int> index = new List<int>();
     
    // We store all the indexes of maximum
    // characters we have in the string
    for(int i = 0; i < str.Length; i++)
    {
        if (str[i] >= maxchar)
        {
            maxchar = str[i];
            index.Add(i);
        }
    }
    string maxstring = "";
     
    // We form a substring from that maximum
    // character index till end and check if
    // its greater that maxstring
    for(int i = 0; i < index.Count; i++)
    {
        if (str.Substring(index[i]).CompareTo(maxstring) > 0)
        {
            maxstring = str.Substring(index[i]);
        }
    }
    return maxstring;
}
 
// Driver code
static public void Main()
{
    string str = "acbacbc";
     
    Console.Write(LexicographicalMaxString(str));
}
}
 
// This code is contributed by avanitrachhadiya2155


Javascript




<script>
// Javascript program to find the lexicographically
// maximum substring.
 
function LexicographicalMaxString(str)
{
    let maxchar = 'a';
    let index = [];
     
    // We store all the indexes of maximum
    // characters we have in the string
    for (let i = 0; i < str.length; i++)
    {
      if (str[i] >= maxchar)
      {
        maxchar = str[i];
        index.push(i);
      }
    }
    let maxstring = "";
  
    // We form a substring from that maximum
    // character index till end and check if
    // its greater that maxstring
    for (let i = 0; i < index.length; i++)
    {
      if (str.substring(index[i],
                        str.length) > maxstring)
      {
        maxstring = str.substring(index[i],
                                  str.length);
      }
    }
    return maxstring;
}
 
// Driver code
let str = "acbacbc"
document.write(LexicographicalMaxString(str));
 
// This code is contributed by ab2127
</script>


Output

cbc

Complexity Analysis:

  • Time Complexity: O(n*m) where n is the length of the string and m is the size of index array.
  • Auxiliary Space: O(n + m) where n is the length of the string and m is the size of index array.

My Personal Notes arrow_drop_up
Recommended Articles
Page :

Start Your Coding Journey Now!