Lexicographically smallest string of length N and sum K
Given two integers N and K. The task is to print the lexicographically smallest string of length N consisting of lower-case English alphabets such that the sum of the characters of the string equals K where ‘a’ = 1, ‘b’ = 2, ‘c’ = 3, ….. and ‘z’ = 26.
Examples:
Input: N = 5, K = 42
Output: aaamz
“aaany”, “babmx”, “aablz” etc. are also valid strings
but “aaamz” is the lexicographically smallest.
Input: N = 3, K = 25
Output: aaw
Approach:
- Initialize char array of size N and fill all the element with ‘a’.
- Start traversing from the end of the array and replace the elements of the array by ‘z’ if K ? 26 or replace it by the character having ASCII value (K + 97 – 1).
- At the same time decrease the value of K by replacing element value i.e. for a = 1, b = 2, c = 3, …, z = 26.
- Also, note that we are subtracting previous element value i.e. (total ‘a’) before current element and adding the same before the end of for loop.
- Check for K < 0 conditions and break the for loop.
- Return the new string formed by the elements of the char array as the answer.
Below is the implementation of the above approach:
C++
#include<bits/stdc++.h>
using namespace std;
string lexo_small( int n, int k)
{
string arr = "" ;
for ( int i = 0; i < n; i++)
arr += 'a' ;
for ( int i = n - 1; i >= 0; i--)
{
k -= i;
if (k >= 0)
{
if (k >= 26)
{
arr[i] = 'z' ;
k -= 26;
}
else
{
char c= ( char )(k + 97 - 1);
arr[i] = c;
k -= arr[i] - 'a' + 1;
}
}
else
break ;
k += i;
}
return arr;
}
int main()
{
int n = 5, k = 42;
string arr = lexo_small(n, k);
cout << arr;
}
|
Java
import java.util.Arrays;
public class Main {
public static char [] lexo_small( int n, int k)
{
char arr[] = new char [n];
Arrays.fill(arr, 'a' );
for ( int i = n - 1 ; i >= 0 ; i--) {
k -= i;
if (k >= 0 ) {
if (k >= 26 ) {
arr[i] = 'z' ;
k -= 26 ;
}
else {
arr[i] = ( char )(k + 97 - 1 );
k -= arr[i] - 'a' + 1 ;
}
}
else
break ;
k += i;
}
return arr;
}
public static void main(String[] args)
{
int n = 5 , k = 42 ;
char arr[] = lexo_small(n, k);
System.out.print( new String(arr));
}
}
|
Python3
def lexo_small(n, k):
arr = "";
for i in range (n):
arr + = 'a' ;
for i in range (n - 1 , - 1 , - 1 ):
k - = i;
if (k > = 0 ):
if (k > = 26 ):
arr = arr[:i] + 'z' + arr[i + 1 :];
k - = 26 ;
else :
c = (k + 97 - 1 );
arr = arr[:i] + chr (c) + arr[i + 1 :];
k - = ord (arr[i]) - ord ( 'a' ) + 1 ;
else :
break ;
k + = i;
return arr;
if __name__ = = '__main__' :
n = 5 ; k = 42 ;
arr = lexo_small(n, k);
print (arr);
|
C#
using System;
class GFG
{
public static char [] lexo_small( int n, int k)
{
char []arr = new char [n];
int i;
for (i = 0; i < n; i++)
arr[i] = 'a' ;
for (i = n - 1; i >= 0; i--)
{
k -= i;
if (k >= 0)
{
if (k >= 26)
{
arr[i] = 'z' ;
k -= 26;
}
else
{
arr[i] = ( char )(k + 97 - 1);
k -= arr[i] - 'a' + 1;
}
}
else
break ;
k += i;
}
return arr;
}
public static void Main()
{
int n = 5, k = 42;
char []arr = lexo_small(n, k);
Console.WriteLine( new string (arr));
}
}
|
Javascript
<script>
function lexo_small(n , k)
{
var arr = Array.from({length: n}, (_, i) => 'a' );
for ( var i = n - 1; i >= 0; i--) {
k -= i;
if (k >= 0) {
if (k >= 26) {
arr[i] = 'z' ;
k -= 26;
}
else {
arr[i] = String.fromCharCode(k + 97 - 1);
k -= arr[i] - 'a' + 1;
}
}
else
break ;
k += i;
}
return arr;
}
var n = 5, k = 42;
var arr = lexo_small(n, k);
document.write(arr.join( '' ));
</script>
|
Time Complexity: O(n), where n is the length of the given string.
Auxiliary Space: O(n)
Last Updated :
22 Dec, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...