Lexicographical Maximum substring of string

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 susbtring 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 current result and update result if needed.



Below is the implementation:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to find the lexicographically
// maximum substring.
#include <bits/stdc++.h>
using namespace std;
  
string LexicographicalMaxString(string str)
{
    // loop to find the max leicographic
    // 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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find the lexicographically
// maximum substring.
  
class GFG {
  
    static String LexicographicalMaxString(String str)
    {
        // loop to find the max leicographic
        // 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

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python 3 program to find the
# lexicographically maximum substring.
def LexicographicalMaxString(str):
      
    # loop to find the max leicographic 
    # 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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find the lexicographically
// maximum substring.
  
using System;
public class GFG {
  
    static String LexicographicalMaxString(String str)
    {
        // loop to find the max leicographic
        // 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

chevron_right


Output:

babaa
Output:

babaa

Optimization :
We find 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.

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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 = "amazon";
    cout << LexicographicalMaxString(str);
    return 0;
}

chevron_right


Output:

zon

GeeksforGeeks has prepared a complete interview preparation course with premium videos, theory, practice problems, TA support and many more features. Please refer Placement 100 for details




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.