Given an integer array arr[] of size N, the task is to construct an array consisting of N+1 strings of length N such that arr[i] is equal to the Longest Common Prefix of ith String and (i+1)th String.
Examples:
Input: arr[] = {1, 2, 3}
Output: {“abb”, “aab”, “aaa”, “aaa”}
Explanation:
Strings “abb” and “aab” have a single character “a” as Longest Common Prefix.
Strings “aab” and “aaa” have “aa” as Longest Common Prefix.
Strings “aaa” and “aaa” have “aa” as Longest Common Prefix.
Input : arr[]={2, 0, 3}
Output: {“bab”, “baa”, “aaa”, “aaa”}
Explanation:
Strings “bab” and “baa” have “ba” as Longest Common Prefix.
Strings “baa” and “aaa” have no common prefix.
Strings “aaa” and “aaa” have “aaa” as Longest Common Prefix.
Approach:
Follow the steps below to solve the problem:
- The idea is to observe that if ith string is known then (i-1)th string can be formed from ith string by changing N – arr[i-1] characters from ith string.
- Start constructing strings from right to left and generate the N + 1 strings.
Illustration:
N = 3, arr[] = {2, 0, 3}
Let the (N + 1)th string is “aaa”
Therefore, the remaining strings from right to left are {“aaa”, “baa”, “bab”}
Below is the implementation of the above approach:
// C++ Program to implement // the above approach #include <bits/stdc++.h> using namespace std;
// Function to find the array of strings vector<string> solve( int n, int arr[])
{ // Marks the (N+1)th string
string s = string(n, 'a' );
vector<string> ans;
ans.push_back(s);
// To generate remaining N strings
for ( int i = n - 1; i >= 0; i--) {
// Find i-th string using
// (i+1)-th string
char ch = s[arr[i]];
// Check if current character
// is b
if (ch == 'b' )
ch = 'a' ;
// Otherwise
else
ch = 'b' ;
s[arr[i]] = ch;
// Insert the string
ans.push_back(s);
}
// Return the answer
return ans;
} // Driver Code int main()
{ int arr[] = { 2, 0, 3 };
int n = sizeof arr / sizeof arr[0];
vector<string> ans = solve(n, arr);
// Print the strings
for ( int i = ans.size() - 1; i >= 0; i--) {
cout << ans[i] << endl;
}
return 0;
} |
// Java Program to implement // the above approach import java.util.*;
class GFG
{ // Function to find the array of strings
static Vector<String> solve( int n, int arr[])
{
// Marks the (N+1)th string
String s = "aaa" ;
Vector<String> ans = new Vector<String>();
ans.add(s);
// To generate remaining N strings
for ( int i = n- 1 ; i >= 0 ; i--)
{
// Check if current character
// is b
if (s.length() - 1 >= arr[i])
{
// Find i-th string using
// (i+1)-th string
char ch = s.charAt(arr[i]);
if (ch == 'b' )
ch = 'a' ;
// Otherwise
else
ch = 'b' ;
char [] myNameChars =s.toCharArray();
myNameChars[arr[i]] = ch;
s = String.valueOf(myNameChars);
}
// Insert the string
ans.add(s);
}
// Return the answer
return ans;
}
// Driver Code
public static void main(String []args)
{
int []arr = { 2 , 0 , 3 };
int n = arr.length;
Vector<String> ans = solve(n, arr);
// Print the strings
for ( int i = ans.size()- 1 ; i >= 0 ; i--)
{
System.out.println(ans.get(i));
}
}
} // This code is contributed by bgangwar59. |
# Python3 Program to implement # the above approach # Function to find the array # of strings def solve(n, arr):
# Marks the (N+1)th
# string
s = 'a' * (n)
ans = []
ans.append(s)
# To generate remaining
# N strings
for i in range (n - 1 ,
- 1 , - 1 ):
# Find i-th string using
# (i+1)-th string
if len (s) - 1 > = arr[i]:
ch = s[arr[i]]
# Check if current
# character
# is b
if (ch = = 'b' ):
ch = 'a'
# Otherwise
else :
ch = 'b'
p = list (s)
p[arr[i]] = ch
s = ''.join(p)
# Insert the string
ans.append(s)
# Return the answer
return ans
# Driver Code if __name__ = = "__main__" :
arr = [ 2 , 0 , 3 ]
n = len (arr)
ans = solve(n, arr)
# Print the strings
for i in range ( len (ans) - 1 ,
- 1 , - 1 ):
print (ans[i])
# This code is contributed by Chitranayal |
// C# Program to implement // the above approach using System;
using System.Collections.Generic;
class GFG
{ // Function to find the array of strings
static List< string > solve( int n, int []arr)
{
// Marks the (N+1)th string
string s = "aaa" ;
List< string > ans = new List< string >();
ans.Add(s);
// To generate remaining N strings
for ( int i = n - 1; i >= 0; i--) {
// Find i-th string using
// (i+1)-th string
if (s.Length-1>=arr[i]){
char ch = s[arr[i]];
// Check if current character
// is b
if (ch == 'b' )
ch = 'a' ;
// Otherwise
else
ch = 'b' ;
char [] chr = s.ToCharArray();
chr[arr[i]] = ch;
s = new string (chr);
}
// Insert the string
ans.Add(s);
}
// Return the answer
return ans;
}
// Driver Code
public static void Main()
{
int []arr = { 2, 0, 3 };
int n = arr.Length;
List< string > ans = solve(n, arr);
// Print the strings
for ( int i = ans.Count - 1; i >= 0; i--) {
Console.WriteLine(ans[i]);
}
}
} // This code is contributed by SURENDRA_GANGWAR. |
<script> // Javascript Program to implement // the above approach // Function to find the array of strings function solve(n, arr)
{ // Marks the (N+1)th string
var s = [ 'a' , 'a' , 'a' ]
var ans = [];
ans.push(s.join( "" ));
// To generate remaining N strings
for ( var i = n - 1; i >= 0; i--) {
if (s.length-1>=arr[i])
{
// Find i-th string using
// (i+1)-th string
var ch = s[arr[i]];
// Check if current character
// is b
if (ch == 'b' )
ch = 'a' ;
// Otherwise
else
ch = 'b' ;
s[arr[i]] = ch;
}
// Insert the string
ans.push(s.join( "" ));
}
// Return the answer
return ans;
} // Driver Code var arr = [ 2, 0, 3 ];
var n = arr.length;
var ans = solve(n, arr);
// Print the strings for ( var i = ans.length - 1; i >= 0; i--) {
document.write( ans[i] + "<br>" );
} // This code iscontributed by rutvik_56. </script> |
bab baa aaa aaa
Time Complexity: O(N)
Auxiliary Space: O(N)