Lexicographical Maximum substring of string
Last Updated :
17 Aug, 2022
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>
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>
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.
Similar Reads
Lexicographical concatenation of all substrings of a string Given a string, find the concatenation of all substrings in lexicographic order.Examples:Input : s = "abc"Output : aababcbbccThe substrings of s in lexicographic order are "a", "b", "c", "ab", "abc", "bc". Concatenation of substrings is "a"+"ab"+"abc"+"b"+"bc"+"c" = "aababcbbcc".Input : s = "cba"Out
7 min read
Maximum occurring lexicographically smallest character in a String Given a string containing lowercase characters. The task is to print the maximum occurring character in the input string. If 2 or more characters appear the same number of times, print the lexicographically (alphabetically) lowest (first) character. Examples: Input: test sample Output: e Explanation
6 min read
Make the String lexicographically larger Given a string str of length n. The task is to find a lexicographic largest string where you are allowed to shift one character from str to any other index only one time. Examples: Input: n = 3, str = "bac"Output: "cba"Explanation: We can perform the given operation exactly one time on the string st
5 min read
K-th lexicographically smallest unique substring of a given string Given a string S. The task is to print the K-th lexicographically the smallest one among the different substrings of s.A substring of s is a string obtained by taking out a non-empty contiguous part in s. For example, if s = ababc, a, bab and ababc are substrings of s, while ac, z, and an empty stri
5 min read
Lexicographically smallest K-length substring containing maximum number of vowels Given string str containing only the lowercase English alphabet and an integer K, the task is to find a K length substring that contains the maximum number of vowels (i.e. 'a', 'e', 'i', 'o', 'u'). If there are multiple such substrings, return the substring which is lexicographically smallest. Examp
15+ min read