Open In App
Related Articles

Lexicographical Maximum substring of string

Improve Article
Improve
Save Article
Save
Like Article
Like

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.

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 : 17 Aug, 2022
Like Article
Save Article
Previous
Next
Similar Reads
Complete Tutorials