给定大小为N的整数数组arr [] ,任务是构造一个由N + 1个长度为N的字符串组成的数组,以使arr [i]等于第i个字符串的最长公共前缀和(i + 1)个字符串。
例子:
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.
方法:
请按照以下步骤解决问题:
- 我们的想法是,通过改变N到第字符串观察从i,如果第i个字符串已知,那么第(i-1)个字符串可以形成– ARR [I-1]从i个字符的字符串。
- 从右到左开始构造字符串,并生成N + 1个字符串。
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”}
下面是上述方法的实现:
C++
// C++ Program to implement
// the above approach
#include
using namespace std;
// Function to find the array of strings
vector solve(int n, int arr[])
{
// Marks the (N+1)th string
string s = string(n, 'a');
vector 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 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 solve(int n, int arr[])
{
// Marks the (N+1)th string
String s = "aaa";
Vector ans = new Vector();
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 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 solve(int n, int []arr)
{
// Marks the (N+1)th string
string s = "aaa";
List ans = new List();
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 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.
bab
baa
aaa
aaa
时间复杂度: O(N)
辅助空间: O(N)