由字符拼接形成的字符串的最大长度,要求每个字符的出现频率为偶数。
连接运算符用于连接一个或多个字符串,以生成一个新的字符串,该字符串是用于通过连接生成它的字符串的组合。在下面的文章中,我们将只在输入字符串中使用大写字母。
连接运算符用于连接一个或多个字符串,以生成一个新的字符串,该字符串是用于通过连接生成它的字符串的组合。在下面的文章中,我们将只在输入字符串中使用大写字母。
让我们通过一些例子来理解这个问题。
输入
"FEFEE", "EFF", "HGG", "AD", "HHH"
说明 − 在这个例子中,我们可以看到,通过连接形成的字符串的最大长度,其每个字符的出现频率为偶数的是“FEFEEEFFHGGHHH”,得到的字符串长度为14。因此,‘14’是最终输出。
F的频率− 4
E的频率− 4
H的频率− 4
G的频率− 2
输入
"ABCD", "AVP", "ADDDC", "BCCCA", "HH", "CA"
输出
18
说明 − 在这个例子中,我们可以看到,通过连接形成的字符串的最大长度,其每个字符的出现频率为偶数的是“ABCDADDDCBCCCAHHCA”,得到的字符串长度为18。因此,‘18’是最终输出。
A的频率:4
B的频率:2
C的频率:6
D的频率:4
H的频率:2
问题说明
让我们尝试理解这个问题并找到它的解决方案。在下面的文章中,我们将讨论一种方法,用于查找由给定字符串数组中的字符串连接形成的字符串的最大长度,要求每个字符的出现频率为偶数。该解决方案将涉及递归和回溯。对于数组中的每个字符串,我们将有两个选择——将其包含到我们最终的字符串中(要求每个字符的出现频率为偶数),或者不包含该字符串。
因此,这种方法涉及创建一个递归函数,并为每个字符串递归调用两次——一次包含它,另一次不包含它。包含每个字符串后,继续检查最终字符串中的所有字符是否具有偶数频率,并继续更新由连接形成的、每个字符具有偶数频率的字符串的最大长度。
递归算法
创建一个递归函数,其基本情况是当索引等于数组的大小时,函数将返回。现在,在这个函数中,我们将考虑两种情况,在第一种情况下,我们将不包含当前字符串并进行递归调用。
而在第二种情况下,我们将包含它,然后使用另一个函数(CheckValid)检查当前输出字符串是否满足要求,即它是否具有每个字符的偶数频率。
如果满足条件,我们将存储该字符串的长度(如果它大于之前的长度)。
接下来,我们将进行另一个递归调用,在这个调用中我们将包含当前字符串。
这样,我们将得到最终的输出大小。
示例
以下是上述方法在各种编程语言中的实现:
#include <stdio.h> #include <string.h> #include <stdbool.h> // Function to check whether the string has an even frequency of each character or not bool CheckValid(const char *str){ // Declare a frequency array that would work like a map to store the count of each alphabet int mapArray[26] = { 0 }; // Store the frequency of each alphabet, we will take uppercase English alphabets only in our string for (int i = 0; i < strlen(str); i++) { mapArray[str[i] - 'A']++; } // Check if the frequency of any alphabet is odd, if yes return false for (int i = 0; i < 26; i++) { if (mapArray[i] % 2 == 1) { return false; } } // If we have all our alphabets in even count, we can return true return true; } // Function to find the maximum length of a string having an even frequency of each character formed by concatenation void FindMaxLength(const char *array[], int i, int size, const char *s, int* maxi){ // Check if we have taken all strings from our array that is check the base case if (i == size) { return; } // Do not Include the string FindMaxLength(array, i + 1, size, s, maxi); // Include the string char combined[100]; // Choose a reasonable maximum length for your combined string strcpy(combined, s); strcat(combined, array[i]); if (CheckValid(combined)) { int currentLength = strlen(combined); if (currentLength > *maxi) { *maxi = currentLength; } } FindMaxLength(array, i + 1, size, combined, maxi); } int main(){ // Size of the string provided by the user int size = 5; // String provided by the user const char* array[5] = { "FEFEE", "EFF", "HGG", "AD", "HHH" }; // Declare a variable to store the maximum length of string formed by concatenation having even frequency of each character int maxi = 0; // Call the function to find the maximum length of string formed by concatenation having an even frequency of each character FindMaxLength(array, 0, size, "", &maxi); // Print the final output printf("The maximum length of string formed by concatenation having an even frequency of each character is: %d", maxi); return 0; }
输出
The maximum length of string formed by concatenation having an even frequency of each character is: 14
#include <bits/stdc++.h> using namespace std; // Function to check whether the string has an even frequency of each character or not bool CheckValid(string str){ // Declare a frequency array that would work like a map to store the count of each alphabet int mapArray[26] = { 0 }; // Store the frequency of each alphabet, we will take uppercase English alphabets only in our string for (int i = 0; i < str.length(); i++) { mapArray[str[i] - 'A']++; } // Check if the frequency of any alphabet is odd, if yes return false for (int i = 0; i < 26; i++) { if (mapArray[i] % 2 == 1) { return false; } } // If we have all our alphabets in even count, we can return true return true; } // Function to find the maximum length of a string having an even frequency of each character formed by concatenation void FindMaxLength(string array[], int i, int size, string s, int& maxi){ // Check if we have taken all strings from our array that is check the base case if (i == size) { return; } // Do not Include the string FindMaxLength(array, i + 1, size, s, maxi); // Include the string s += array[i]; // Check if the string collected is giving us a string with all character counts as even, constituted in it if(CheckValid(s)) { // Store the maximum of the previous and current length if(s.length() > maxi) { maxi = s.length(); } } FindMaxLength(array, i + 1, size, s, maxi); } int main(){ // Size of the string provided by the user int size = 5; // String provided by the user string array[5] = { "FEFEE", "EFF", "HGG", "AD", "HHH" }; // Declare a variable to store the maximum length of string formed by concatenation having even frequency of each character int maxi = 0; // Call the function to find the maximum length of string formed by concatenation having an even frequency of each character FindMaxLength(array, 0, size, "", maxi); // Print the final output cout << "The maximum length of string formed by concatenation having an even frequency of each character is: "<< maxi <<endl; return 0; }
输出
The maximum length of string formed by concatenation having an even frequency of each character is: 14
public class Main { public static boolean CheckValid(String str) { // Declare a frequency array that would work like a map to store the count of each alphabet int[] mapArray = new int[26]; // Store the frequency of each alphabet, we will take uppercase English alphabets only in our string for (int i = 0; i < str.length(); i++) { mapArray[str.charAt(i) - 'A']++; } // Check if the frequency of any alphabet is odd, if yes return false for (int i = 0; i < 26; i++) { if (mapArray[i] % 2 == 1) { return false; } } // If we have all our alphabets in even count, we can return true return true; } //Function to find the maximum length of a string having an even frequency of each character formed by concatenation public static void FindMaxLength(String[] array, int i, int size, String s, int[] maxi) { // Check if we have taken all strings from our array that is check the base case if (i == size) { return; } FindMaxLength(array, i + 1, size, s, maxi); s += array[i]; if (CheckValid(s)) { int currentLength = s.length(); // Store the maximum of the previous and current length if (currentLength > maxi[0]) { maxi[0] = currentLength; } } FindMaxLength(array, i + 1, size, s, maxi); } public static void main(String[] args) { int size = 5; String[] array = { "FEFEE", "EFF", "HGG", "AD", "HHH" }; int[] maxi = { 0 }; FindMaxLength(array, 0, size, "", maxi); System.out.println("The maximum length of a string formed by concatenation having an even frequency of each character is: " + maxi[0]); } }
输出
The maximum length of a string formed by concatenation having an even frequency of each character is: 14
# Function to check whether the string has an even frequency of each character or not def CheckValid(s): # Declare a frequency array that would work like a map to store the count of each alphabet mapArray = [0] * 26 # Store the frequency of each alphabet; we will take uppercase English alphabets only in our string for char in s: if 'A' <= char <= 'Z': mapArray[ord(char) - ord('A')] += 1 # Check if the frequency of any alphabet is odd; if yes, return False for count in mapArray: if count % 2 == 1: return False # If we have all our alphabets in even count, we can return True return True # Function to find the maximum length of a string having an even frequency of each character formed by concatenation def FindMaxLength(array, i, size, s, maxi): # Check if we have taken all strings from our array, that is, check the base case if i == size: return # Do not include the string FindMaxLength(array, i + 1, size, s, maxi) # Include the string s += array[i] # Check if the string collected is giving us a string with all character counts as even, constituted in it if CheckValid(s): # Store the maximum of the previous and current length if len(s) > maxi[0]: maxi[0] = len(s) FindMaxLength(array, i + 1, size, s, maxi) if __name__ == "__main__": size = 5 # String provided by the user array = ["FEFEE", "EFF", "HGG", "AD", "HHH"] # Declare a variable to store the maximum length of string formed by concatenation having even frequency of each character maxi = [0] # Call the function to find the maximum length of string formed by concatenation having an even frequency of each character FindMaxLength(array, 0, size, "", maxi) # Print the final output print("The maximum length of a string formed by concatenation having an even frequency of each character is:", maxi[0])
输出
The maximum length of a string formed by concatenation having an even frequency of each character is: 14
上述代码的复杂度
时间复杂度 − O(n * m * (2^n));其中‘n’是数组的长度,即给定字符串的总数,‘m’是数组中出现的最长字符串的长度。每个字符串将在递归调用中执行两次,使得递归函数的时间复杂度为‘2^n’,而CheckValid函数将花费与由连接形成的最长字符串的大小成正比的时间,这可能高达(n * m),即当我们将给定数组中包含的每个字符串都包含在最终答案中的情况。
空间复杂度 − O(1);我们在上面的代码中没有在任何数据结构中存储任何变量。
结论
在本文中,我们找到了一种方法来查找由连接形成的字符串的最大长度,要求每个字符的出现频率为偶数。我们使用递归和回溯等概念理解了这种方法。但是,上面给出的代码的时间复杂度非常大,因此该代码只能在字符串和数组的大小有限制的情况下工作。