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

Related Articles

Lexicographical Maximum substring of string

Improve Article
Save Article
Like Article
Improve Article
Save Article
Like 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
Last Updated : 17 Aug, 2022
Like Article
Save Article
Similar Reads
Related Tutorials