Given an array, arr[] of N integers, where arr[i] represents the number of distinct characters in the prefix of length (i + 1) of a string S. The task is to find the lexicographically smallest string (if any exists) that satisfies the given prefix array. The string should be of lowercase English alphabets [a-z]. If no such string exists then print -1.
Examples:
Input: arr[] = {1, 1, 2, 3}
Output: aabc
prefix[0] has 1 distinct character
prefix[1] has 1 distinct character
prefix[2] has 2 distinct characters
prefix[3] has 3 distinct characters
And the string is the smallest possible.
Input: arr[] = {1, 2, 2, 3, 3, 4}
Output: abacad
Input: arr[] = {1, 1, 3, 3}
Output: -1
Approach: The first character of every string will always be ‘a’. Since we have to find the lexicographically smallest string. Therefore, if the number of different characters in the prefix of length i and i + 1 is same, then (i+1)th character will be ‘a’ otherwise it will be a different character from all characters in length i and it will be one greater than the greatest character in the prefix of length i.
For example, if prefix array is {1, 2, 2, 3, 4} then the first character will be ‘a’, the second character will be ‘b’ since number of different character is 2 (it can also be ‘c’ or ‘d’, etc but we have to take lexicographically smallest). Third character will be either ‘a’ or ‘b’ but we take ‘a’ since “aba” is smaller than “abb”.
Similarly, fourth and fifth character will be ‘c’ and ‘d’ respectively. Therefore, the resultant string that satisfies the given prefix array will be “abacd”.
Below is the implementation of the above approach:
C++
#include <iostream>
using namespace std;
string smallestString( int N, int A[])
{
char ch = 'a' ;
string S = "" ;
if (N < 1 || A[0] != 1) {
S = "-1" ;
return S;
}
S += ch;
ch++;
for ( int i = 1; i < N; i++) {
int diff = A[i] - A[i - 1];
if (diff > 1 || diff < 0 || A[i] > 26) {
S = "-1" ;
return S;
}
else if (diff == 0)
S += 'a' ;
else {
S += ch;
ch++;
}
}
return S;
}
int main()
{
int arr[] = { 1, 1, 2, 3, 3 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << smallestString(n, arr);
return 0;
}
|
Java
import java.io.*;
public class GFG
{
static String smallestString( int N, int []A)
{
char ch = 'a' ;
String S = "" ;
if (N < 1 || A[ 0 ] != 1 )
{
S = "-1" ;
return S;
}
S += ch;
ch++;
for ( int i = 1 ; i < N; i++)
{
int diff = A[i] - A[i - 1 ];
if (diff > 1 || diff < 0 || A[i] > 26 )
{
S = "-1" ;
return S;
}
else if (diff == 0 )
S += 'a' ;
else
{
S += ch;
ch++;
}
}
return S;
}
public static void main(String args[])
{
int []arr = { 1 , 1 , 2 , 3 , 3 };
int n = arr.length;
System.out.println(smallestString(n, arr));
}
}
|
Python3
def smallestString(N, A):
ch = 'a'
S = ""
if (N < 1 or A[ 0 ] ! = 1 ):
S = "-1"
return S
S + = str (ch)
ch = chr ( ord (ch) + 1 )
for i in range ( 1 , N):
diff = A[i] - A[i - 1 ]
if (diff > 1 or diff < 0 or A[i] > 26 ):
S = "-1"
return S
elif (diff = = 0 ):
S + = 'a'
else :
S + = ch
ch = chr ( ord (ch) + 1 )
return S
arr = [ 1 , 1 , 2 , 3 , 3 ]
n = len (arr)
print (smallestString(n, arr))
|
C#
using System;
class GFG
{
static string smallestString( int N, int []A)
{
char ch = 'a' ;
string S = "" ;
if (N < 1 || A[0] != 1)
{
S = "-1" ;
return S;
}
S += ch;
ch++;
for ( int i = 1; i < N; i++)
{
int diff = A[i] - A[i - 1];
if (diff > 1 || diff < 0 || A[i] > 26)
{
S = "-1" ;
return S;
}
else if (diff == 0)
S += 'a' ;
else
{
S += ch;
ch++;
}
}
return S;
}
static void Main()
{
int []arr = { 1, 1, 2, 3, 3 };
int n = arr.Length;
Console.WriteLine(smallestString(n, arr));
}
}
|
PHP
<?PHP
function smallestString( $N , $A )
{
$ch = 'a' ;
$S = "" ;
if ( $N < 1 || $A [0] != 1)
{
$S = "-1" ;
return $S ;
}
$S .= $ch ;
$ch ++;
for ( $i = 1; $i < $N ; $i ++)
{
$diff = $A [ $i ] - $A [ $i - 1];
if ( $diff > 1 || $diff < 0 || $A [ $i ] > 26)
{
$S = "-1" ;
return $S ;
}
else if ( $diff == 0)
$S .= 'a' ;
else
{
$S .= $ch ;
$ch ++;
}
}
return $S ;
}
$arr = array ( 1, 1, 2, 3, 3 );
$n = sizeof( $arr );
echo (smallestString( $n , $arr ));
?>
|
Javascript
<script>
function smallestString(N, A)
{
let ch = 'a' ;
let S = "" ;
if (N < 1 || A[0] != 1)
{
S = "-1" ;
return S;
}
S += ch;
ch = String.fromCharCode(ch.charCodeAt(0) + 1);
for (let i = 1; i < N; i++)
{
let diff = A[i] - A[i - 1];
if (diff > 1 || diff < 0 || A[i] > 26)
{
S = "-1" ;
return S;
}
else if (diff == 0)
S += 'a' ;
else
{
S += ch;
ch = String.fromCharCode(
ch.charCodeAt(0) + 1);
}
}
return S;
}
let arr = [ 1, 1, 2, 3, 3 ];
let n = arr.length;
document.write(smallestString(n, arr));
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(1)