Construct an Array of Strings having Longest Common Prefix specified by the given Array

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++
// C++ Program to implement// the above approach#include <bits/stdc++.h>using namespace std;// Function to find the array of stringsvector<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 Codeint 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
// Java Program to implement// the above approachimport 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
# Python3 Program to implement# the above approach# Function to find the array # of stringsdef 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 Codeif __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#
// C# Program to implement// the above approachusing 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. |
Javascript
<script>// Javascript Program to implement// the above approach// Function to find the array of stringsfunction 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 Codevar arr = [ 2, 0, 3 ];var n = arr.length;var ans = solve(n, arr);// Print the stringsfor (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)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!



