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 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
// 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
# 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#
// 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. |
Javascript
<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)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!