Lexicographically next greater string using same character set
Last Updated :
14 Sep, 2022
Given a number K and a string S, We have to Find the lexicographically smallest string str of length K such that it’s set of letters is a subset of the set of letters of S and S is lexicographically smaller than str.
Examples:
Input :k = 3
s = zbf
Output: zbz
Explanation: zbz is greater than zbf and it is
smaller than any other lexicographically greater
string than zbf
Input : k = 3
s = gi
Output: gig
Explanation: gig > gi and size is 3.
Approach: If size of string is less than k, we should simply add k – s.size() minimum symbols from s.
If the size of the string is greater than or equal to k then we need to replace all symbols in the suffix of first k symbols of string smallest symbols and replace the character before this suffix with next greater character existing in the string.
Note: If k – 1 index in string holds the greatest character then we move one index back and we move back until we find a character which is not equal to the greatest character.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
void lexoString(string s, int k)
{
int n = s.size();
vector< char > v;
map< char , int > mp;
for ( int i = 0; i < s.size(); i++) {
if (mp[s[i]] == 0) {
mp[s[i]] = 1;
v.push_back(s[i]);
}
}
sort(v.begin(), v.end());
if (k > n)
{
cout << s;
for ( int i = n; i < k; i++) {
cout << v[0];
}
return ;
}
for ( int i = k - 1; i >= 0; i--) {
if (s[i] != v[v.size() - 1]) {
for ( int j = 0; j < i; j++) {
cout << s[j];
}
for ( int j = 0; j < v.size(); j++) {
if (v[j] > s[i]) {
cout << v[j];
break ;
}
}
for ( int j = i + 1; j < k; j++)
cout << v[0];
return ;
}
}
cout << "No lexicographically greater string of length "
<< k << " possible here." ;
}
int main()
{
string s = "gi" ;
int k = 3;
lexoString(s, k);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static void lexoString( char [] s, int k)
{
int n = s.length;
Vector<Character> v = new Vector<>();
Map<Character, Integer> mp = new HashMap<>();
for ( int i = 0 ; i < s.length; i++)
{
if (!mp.containsKey(s[i]))
{
mp.put(s[i], 1 );
v.add(s[i]);
}
}
Collections.sort(v);
if (k > n)
{
System.out.print(String.valueOf(s));
for ( int i = n; i < k; i++)
{
System.out.print(v.get( 0 ));
}
return ;
}
for ( int i = k - 1 ; i >= 0 ; i--)
{
if (s[i] != v.get(v.size() - 1 ))
{
for ( int j = 0 ; j < i; j++)
{
System.out.print(s[j]);
}
for ( int j = 0 ; j < v.size(); j++)
{
if (v.get(j) > s[i])
{
System.out.print(v.get(j));
break ;
}
}
for ( int j = i + 1 ; j < k; j++)
{
System.out.print(v.get( 0 ));
}
return ;
}
}
System.out.print( "No lexicographically greater string of length "
+ k + " possible here." );
}
public static void main(String arr[])
{
String s = "gi" ;
int k = 3 ;
lexoString(s.toCharArray(), k);
}
}
|
Python3
def lexoString(s, k):
n = len (s)
v = []
mp = {s[i]: 0 for i in range ( len (s))}
for i in range ( len (s)):
if (mp[s[i]] = = 0 ):
mp[s[i]] = 1
v.append(s[i])
v.sort(reverse = False )
if (k > n):
print (s, end = "")
for i in range (n, k, 1 ):
print (v[ 0 ], end = "")
return ;
i = k - 1
while (i > = 0 ):
if (s[i] ! = v[ len (v) - 1 ]):
for j in range ( 0 , i, 1 ):
print (s[j], end = " " )
for j in range ( 0 , len (v), 1 ):
if (v[j] > s[i]):
print (v[j], end = " " )
break
for j in range (i + 1 , k, 1 ):
print (v[ 0 ], end = " " )
re1turn
i - = 1
print ( "No lexicographically greater" ,
"string of length" , k, "possible here." )
if __name__ = = '__main__' :
s = "gi"
k = 3
lexoString(s, k)
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static void lexoString( char [] s, int k)
{
int n = s.Length;
List< char > v = new List< char >();
Dictionary< char ,
int > mp = new Dictionary< char ,
int >();
for ( int i = 0; i < s.Length; i++)
{
if (!mp.ContainsKey(s[i]))
{
mp.Add(s[i], 1);
v.Add(s[i]);
}
}
v.Sort();
if (k > n)
{
Console.Write(String.Join( "" , s));
for ( int i = n; i < k; i++)
{
Console.Write(v[0]);
}
return ;
}
for ( int i = k - 1; i >= 0; i--)
{
if (s[i] != v[v.Count - 1])
{
for ( int j = 0; j < i; j++)
{
Console.Write(s[j]);
}
for ( int j = 0; j < v.Count; j++)
{
if (v[j] > s[i])
{
Console.Write(v[j]);
break ;
}
}
for ( int j = i + 1; j < k; j++)
{
Console.Write(v[0]);
}
return ;
}
}
Console.Write( "No lexicographically greater " +
"string of length " + k +
" possible here." );
}
public static void Main(String []arr)
{
String s = "gi" ;
int k = 3;
lexoString(s.ToCharArray(), k);
}
}
|
Javascript
<script>
function lexoString(s, k) {
var n = s.length;
var v = [];
var mp = {};
for ( var i = 0; i < s.length; i++) {
if (!mp.hasOwnProperty(s[i])) {
mp[s[i]] = 1;
v.push(s[i]);
}
}
v.sort((a, b) => a - b);
if (k > n) {
document.write(s.join( "" ));
for ( var i = n; i < k; i++) {
document.write(v[0]);
}
return ;
}
for ( var i = k - 1; i >= 0; i--) {
if (s[i] !== v[v.length - 1]) {
for ( var j = 0; j < i; j++) {
document.write(s[j]);
}
for ( var j = 0; j < v.length; j++) {
if (v[j] > s[i]) {
document.write(v[j]);
break ;
}
}
for ( var j = i + 1; j < k; j++) {
document.write(v[0]);
}
return ;
}
}
document.write(
"No lexicographically greater " +
"string of length " +
k +
" possible here."
);
}
var s = "gi" ;
var k = 3;
lexoString(s.split( "" ), k);
</script>
|
Time Complexity : O(k + s.size())
Share your thoughts in the comments
Please Login to comment...