Find the lexicographically smallest string which satisfies the given condition

09 Jun, 2022
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++
Java
Python3
C#
PHP
Javascript
// C++ implementation of the approach#include <iostream>using namespace std; // Function to return the required stringstring smallestString(int N, int A[]){    // First character will always be 'a'    char ch = 'a';     // To store the resultant string    string S = "";     // Since length of the string should be    // greater than 0 and first element    // of array should be 1    if (N < 1 || A[0] != 1) {        S = "-1";        return S;    }     S += ch;    ch++;     // Check one by one all element of given prefix array    for (int i = 1; i < N; i++) {        int diff = A[i] - A[i - 1];         // If the difference between any two        // consecutive elements of the prefix array        // is greater than 1 then there will be no such        // string possible that satisfies the given array        // Also, string cannot have more than        // 26 distinct characters        if (diff > 1 || diff < 0 || A[i] > 26) {            S = "-1";            return S;        }         // If difference is 0 then the (i + 1)th character        // will be same as the ith character        else if (diff == 0)            S += 'a';         // If difference is 1 then the (i + 1)th character        // will be different from the ith character        else {            S += ch;            ch++;        }    }     // Return the resultant string    return S;} // Driver codeint main(){    int arr[] = { 1, 1, 2, 3, 3 };    int n = sizeof(arr) / sizeof(arr[0]);    cout << smallestString(n, arr);     return 0;}
// Java implementation of the above approachclass GFG{         // Function to return the required string    static String smallestString(int N, int []A)    {        // First character will always be 'a'        char ch = 'a';             // To store the resultant string        String S = "";             // Since length of the string should be        // greater than 0 and first element        // of array should be 1        if (N < 1 || A[0] != 1)        {            S = "-1";            return S;        }             S += ch;        ch++;             // Check one by one all element of given prefix array        for (int i = 1; i < N; i++)        {            int diff = A[i] - A[i - 1];                 // If the difference between any two            // consecutive elements of the prefix array            // is greater than 1 then there will be no such            // string possible that satisfies the given array            // Also, string cannot have more than            // 26 distinct characters            if (diff > 1 || diff < 0 || A[i] > 26)            {                S = "-1";                return S;            }                 // If difference is 0 then the (i + 1)th character            // will be same as the ith character            else if (diff == 0)                S += 'a';                 // If difference is 1 then the (i + 1)th character            // will be different from the ith character            else            {                S += ch;                ch++;            }        }             // Return the resultant string        return S;    }         // Driver code    public static void main(String args[])    {        int []arr = { 1, 1, 2, 3, 3 };        int n = arr.length;        System.out.println(smallestString(n, arr));    }} // This code is contributed by Ryuga
# Function to return the required stringdef smallestString(N, A):         # First character will always be 'a'    ch = 'a'     # To store the resultant string    S = ""     # Since length of the string should be    # greater than 0 and first element    # of array should be 1    if (N < 1 or A[0] != 1):        S = "-1"        return S     S += str(ch)    ch = chr(ord(ch) + 1)     # Check one by one all element of    # given prefix array    for i in range(1, N):        diff = A[i] - A[i - 1]         # If the difference between any two        # consecutive elements of the prefix        # array is greater than 1 then there        # will be no such string possible that        # satisfies the given array.        # Also, string cannot have more than        # 26 distinct characters        if (diff > 1 or diff < 0 or A[i] > 26):            S = "-1"            return S         # If difference is 0 then the        # (i + 1)th character will be        # same as the ith character        elif (diff == 0):            S += 'a'         # If difference is 1 then the        # (i + 1)th character will be        # different from the ith character        else:            S += ch            ch = chr(ord(ch) + 1)     # Return the resultant string    return S # Driver codearr = [1, 1, 2, 3, 3]n = len(arr)print(smallestString(n, arr)) # This code is contributed# by mohit kumar
// C# implementation of the approachusing System; class GFG{     // Function to return the required stringstatic string smallestString(int N, int []A){    // First character will always be 'a'    char ch = 'a';     // To store the resultant string    string S = "";     // Since length of the string should be    // greater than 0 and first element    // of array should be 1    if (N < 1 || A[0] != 1)    {        S = "-1";        return S;    }     S += ch;    ch++;     // Check one by one all element of given prefix array    for (int i = 1; i < N; i++)    {        int diff = A[i] - A[i - 1];         // If the difference between any two        // consecutive elements of the prefix array        // is greater than 1 then there will be no such        // string possible that satisfies the given array        // Also, string cannot have more than        // 26 distinct characters        if (diff > 1 || diff < 0 || A[i] > 26)        {            S = "-1";            return S;        }         // If difference is 0 then the (i + 1)th character        // will be same as the ith character        else if (diff == 0)            S += 'a';         // If difference is 1 then the (i + 1)th character        // will be different from the ith character        else        {            S += ch;            ch++;        }    }     // Return the resultant string    return S;} // Driver codestatic void Main(){    int []arr = { 1, 1, 2, 3, 3 };    int n = arr.Length;    Console.WriteLine(smallestString(n, arr));}} // This code is contributed by mits
<?PHP// PHP implementation of the above approach// Function to return the required stringfunction smallestString($N, $A){    // First character will always be 'a'    $ch = 'a';     // To store the resultant string    $S = "";     // Since length of the string should be    // greater than 0 and first element    // of array should be 1    if ($N < 1 || $A[0] != 1)    {        $S = "-1";        return $S;    }     $S .= $ch;    $ch++;     // Check one by one all element of given prefix array    for ($i = 1; $i < $N; $i++)    {        $diff = $A[$i] - $A[$i - 1];         // If the difference between any two        // consecutive elements of the prefix array        // is greater than 1 then there will be no such        // string possible that satisfies the given array        // Also, string cannot have more than        // 26 distinct characters        if ($diff > 1 || $diff < 0 || $A[$i] > 26)        {            $S = "-1";            return $S;        }         // If difference is 0 then the (i + 1)th character        // will be same as the ith character        else if ($diff == 0)            $S .= 'a';         // If difference is 1 then the (i + 1)th character        // will be different from the ith character        else        {            $S .= $ch;            $ch++;        }    }     // Return the resultant string    return $S;} // Driver code$arr = array( 1, 1, 2, 3, 3 );$n = sizeof($arr);echo(smallestString($n, $arr)); // This code is contributed by Code_Mech?>
<script> // Javascript implementation of the approach // Function to return the required stringfunction smallestString(N, A){         // First character will always be 'a'    let ch = 'a';     // To store the resultant string    let S = "";     // Since length of the string should be    // greater than 0 and first element    // of array should be 1    if (N < 1 || A[0] != 1)    {        S = "-1";        return S;    }     S += ch;    ch = String.fromCharCode(ch.charCodeAt(0) + 1);     // Check one by one all element of    // given prefix array    for(let i = 1; i < N; i++)    {        let diff = A[i] - A[i - 1];         // If the difference between any two        // consecutive elements of the prefix        // array is greater than 1 then there        // will be no such string possible that        // satisfies the given array. Also,        // string cannot have more than        // 26 distinct characters        if (diff > 1 || diff < 0 || A[i] > 26)        {            S = "-1";            return S;        }         // If difference is 0 then the (i + 1)th        // character will be same as the ith character        else if (diff == 0)            S += 'a';         // If difference is 1 then the (i + 1)th        // character will be different from the        // ith character        else        {            S += ch;            ch = String.fromCharCode(                ch.charCodeAt(0) + 1);        }    }     // Return the resultant string    return S;} // Driver codelet arr = [ 1, 1, 2, 3, 3 ];let n = arr.length; document.write(smallestString(n, arr)); // This code is contributed by souravmahato348 </script>
aabca
 
Time Complexity: O(n)Auxiliary Space: O(1)
mohit kumar 29
Mithun Kumar
ankthon
Code_Mech
souravmahato348
rishavnitro
Greedy
Mathematical
Strings
Strings
Greedy
Mathematical
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Huffman Coding | Greedy Algo-3
Coin Change | DP-7
Activity Selection Problem | Greedy Algo-1
Fractional Knapsack Problem
Job Sequencing Problem
Program for Fibonacci numbers
Set in C++ Standard Template Library (STL)
C++ Data Types
Merge two sorted arrays
Coin Change | DP-7