Table des matières
Exemple
Instructions
Méthode 2
Algorithme
Sortie
Maison développement back-end C++ Trouver la longueur du sous-ensemble le plus long composé de A 0 et B 1 à partir d'un tableau de chaînes

Trouver la longueur du sous-ensemble le plus long composé de A 0 et B 1 à partir d'un tableau de chaînes

Sep 11, 2023 pm 12:09 PM
字符串数组

Trouver la longueur du sous-ensemble le plus long composé de A 0 et B 1 à partir dun tableau de chaînes

Dans ce problème, nous devons trouver le sous-ensemble le plus long contenant au plus des A 0 et des B1. Tout ce que nous avons à faire est de trouver tous les sous-ensembles possibles à l'aide d'éléments de tableau et de trouver le sous-ensemble le plus long contenant au plus A 0 et B1 .

Dans ce tutoriel, nous allons d'abord apprendre la méthode récursive pour résoudre le problème. Après cela, nous utiliserons des méthodes de programmation dynamique pour optimiser le code.

Énoncé du problème - On nous donne un tableau contenant N chaînes binaires. De plus, on nous donne les entiers A et B. Nous devons créer le sous-ensemble le plus long en utilisant la chaîne binaire donnée de telle sorte qu'il ne contienne pas plus de A 0 et B1.

Exemple

Input –  arr = {"101", "0", "101", "0", "1"}, A = 2, B = 1
Copier après la connexion
Output – 3
Copier après la connexion
Copier après la connexion

Instructions

Le sous-ensemble le plus long est { "0", "0", "1"}, qui contient 2 0 et 1 1.

Input –  arr = {"0", "101", "0", "1"}, A = 3, B = 3
Copier après la connexion
Output – 3
Copier après la connexion
Copier après la connexion

Instructions

Le sous-ensemble le plus long est {"0", "101", "0", "1"}, 3 0 et 3 1.

Méthode 1

Dans cette section, nous allons apprendre une méthode simple utilisant la récursivité. Nous construirons tous les sous-ensembles possibles en utilisant les éléments du tableau et trouverons le sous-ensemble le plus long contenant A 0 et B 1 .

Algorithme

  • Étape 1 - Définissez la fonction countZeros() pour compter le nombre total de zéros dans une chaîne binaire donnée.

  • Étape 1.1 - Initialisez la variable "count" à zéro.

  • Étape 1.2 - Utilisez une boucle for pour parcourir la chaîne.

  • Étape 1.3 - Si le caractère au i-ième index est "0", alors augmentez la valeur de "cnt" de 1.

  • Étape 1.2 - Renvoyez la valeur de la variable "cnt".

  • Étape 2 - getMaxSubsetLen() renvoie une valeur entière et prend le vecteur arr, int A, int B et index comme arguments.

  • Étape 3 - Définissez le cas de base au sein de la fonction. Renvoie 0 si l'index est égal à la taille du vecteur, ou si les valeurs de A et B sont toutes deux nulles.

  • Étape 4 - Maintenant, comptez le nombre total de zéros dans la chaîne à l'index.

  • Étape 5 - Soustrayez le nombre total de 1 de la longueur de la chaîne pour obtenir le nombre total de 1.

  • Étape 6 - Initialisez la "première" variable à 0.

  • Étape 7 - Contient la chaîne binaire actuelle si le nombre total de 0 et 1 est inférieur à A et B respectivement. Stocke 1 + la valeur de retour d'un appel de fonction récursif. Lors d'un appel récursif, 0 et 1 sont soustraits de A et B.

  • Étape 8 - Excluez la chaîne actuelle et stockez la valeur résultante dans la "seconde" variable.

  • Étape 9 - Renvoyez la valeur maximale du premier et du deuxième.

Exemple

#include <bits/stdc++.h>
using namespace std;
// function to count the number of 0's in a string
int countZeros(string s){

   // initialize count variable to 0
   int count = 0;
   
   // traverse the string
   for (int i = 0; i < s.size(); i++){
   
      // if the current character is 0, the increment count
      if (s[i] == '0'){
         count++;
      }
   }
   
   // return count
   return count;
}

// recursive function to find the maximum length of a subset of strings according to the given condition.
int getMaxSubsetLen(vector<string> arr, int A, int B, int index){

   // base case
   // if all the strings are traversed, or A + B becomes 0
   if (index == arr.size() || A + B == 0){
      return 0;
   }
   
   // total number of 0's in arr[index] string
   int zero = countZeros(arr[index]);
   
   // total number of 1's in arr[index] string
   int one = arr[index].size() - zero;
   
   // Stores the length of the subset, if arr[i] is included.
   int first = 0;
   
   // if the number of 0's and 1's in arr[index] is less than or equal to A and B, respectively, then include the string
   if (zero <= A && one <= B){
      first = 1 + getMaxSubsetLen(arr, A - zero, B - one, index + 1);
   }
   
   // Stores the length of the subset, if arr[i] is not included.
   int second = getMaxSubsetLen(arr, A, B, index + 1);
   
   // return the maximum of the first and second
   return max(first, second);
}

// Driver Code
int main(){
   vector<string> arr = {"101", "0", "101", "0", "1"};
   int A = 2, B = 1;
   cout << "The maximum length of the subset consisting at most A 0s and B 1s is - " <<getMaxSubsetLen(arr, A, B, 0);
   return 0;
}
Copier après la connexion

Sortie

The maximum length of the subset consisting at most A 0s and B 1s is - 3
Copier après la connexion
Copier après la connexion

Complexité temporelle - O(2N) puisque nous trouvons tous les sous-ensembles possibles en utilisant N éléments du tableau.

Complexité spatiale - O(1)

Méthode 2

Nous avons optimisé la méthode ci-dessus dans cette section. Nous utilisons des méthodes de programmation dynamique pour résoudre ce problème. Il stocke le résultat de l’état précédent pour réduire la complexité temporelle du problème.

Algorithme

  • Étape 1 - Définissez la fonction countZeros() pour compter le nombre total de zéros dans une chaîne binaire spécifique, tout comme nous l'avons fait dans la méthode ci-dessus.

  • Étape 2 - Créez un vecteur 3D de taille A x B x N pour stocker le résultat de l'état précédent. Dans la liste, nous stockerons la longueur du sous-ensemble à l'index "I" lorsque le total 0 est égal à A et 1 est égal à B. De plus, transmettez-le comme argument à la fonction getMaxSubsetLen().

    < /里>
  • Étape 3 - Définissez le cas de base comme nous l'avons fait dans la méthode ci-dessus.

  • Étape 4 - Si la valeur de dpTable[A][B][index] est supérieure à 0, cela signifie que l'état a été calculé et que sa valeur est renvoyée.

  • Étape 5 - Comptez le nombre total de 0 et de 1 dans la chaîne actuelle.

  • Étape 6 - Obtenez la valeur résultante, incluant et excluant la chaîne actuelle.

  • Étape 7 - Utilisez la fonction max() pour obtenir la valeur maximale du premier et du deuxième, stockez-la dans dpTable[A][B][index] et retournez

Exemple

#include <bits/stdc++.h>
using namespace std;
// function to count the number of 0's in a string
int countZeros(string s){

   // initialize count variable to 0
   int count = 0;
   
   // traverse the string
   for (int i = 0; i < s.size(); i++){
   
      // if the current character is 0, the increment count
      if (s[i] == '0'){
         count++;
      }
   }
   
   // return count
   return count;
}

// recursive function to find the maximum length of a subset of strings according to the given condition.
int getMaxSubsetLen(vector<string> array, int A, int B, int index, vector<vector<vector<int>>> &dpTable){

   // base case
   if (index == array.size() || A + B == 0){
      return 0;
   }
   
   // return if already calculated
   if (dpTable[A][B][index] > 0){
      return dpTable[A][B][index];
   }
   
   // total number of 0's in the current string
   int zero = countZeros(array[index]);
   
   // total number of 1's in the current string
   int one = array[index].size() - zero;
   
   // to store the length of the subset can be formed by including the current string
   int first = 0;
   
   // if the total number of 0's and 1's in the current string is less than or equal to A and B, respectively
   if (zero <= A && one <= B){
      first = 1 + getMaxSubsetLen(array, A - zero, B - one, index + 1, dpTable);
   }
   
   // to store the length of the subset can be formed by excluding the current string
   int second = getMaxSubsetLen(array, A, B, index + 1, dpTable);
   
   // store the maximum of the first and second, and return
   return dpTable[A][B][index] = max(first, second);
}
int main(){
   vector<string> arr = {"101", "0", "101", "0", "1"};
   int A = 2, B = 1;
   vector<vector<vector<int>>> dpTable(A + 1, vector<vector<int>>(B + 1, vector<int>(arr.size() + 1, 0)));
   cout << "The maximum length of the subset consisting at most A 0s and B 1s is - " << getMaxSubsetLen(arr, A, B, 0, dpTable);
   return 0;
}
Copier après la connexion

Sortie

The maximum length of the subset consisting at most A 0s and B 1s is - 3
Copier après la connexion
Copier après la connexion

Complexité temporelle - O(A*B*N) puisque nous devons remplir la liste 3D pour obtenir le résultat.

Complexité spatiale - O(A*B*N) car nous utilisons des listes 3D pour la méthode de programmation dynamique.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment utiliser la fonction split() dans Oracle Comment utiliser la fonction split() dans Oracle May 07, 2024 pm 01:06 PM

La fonction SPLIT() divise une chaîne en un tableau par un délimiteur spécifié, renvoyant un tableau de chaînes où chaque élément est une partie séparée par un délimiteur de la chaîne d'origine. L'utilisation comprend : diviser une liste de valeurs séparées par des virgules dans un tableau, extraire les noms de fichiers des chemins et diviser les adresses e-mail en noms d'utilisateur et domaines.

Comment trier les chaînes en Java Comment trier les chaînes en Java Apr 02, 2024 am 02:18 AM

Façons de trier des chaînes en Java : utilisez la méthode Arrays.sort() pour trier un tableau de chaînes par ordre croissant. Utilisez la méthode Collections.sort() pour trier une liste de chaînes par ordre croissant. Utilisez l'interface Comparator pour un tri personnalisé des chaînes.

Que signifie \0 en langage C Que signifie \0 en langage C Apr 27, 2024 pm 10:54 PM

En langage C, \0 est la marque de fin d’une chaîne, appelée caractère nul ou terminateur. Étant donné que les chaînes sont stockées en mémoire sous forme de tableaux d'octets, le compilateur reconnaît la fin de la chaîne via \0, garantissant ainsi que les chaînes sont traitées correctement. \0 Comment ça marche : Le compilateur arrête de lire les caractères lorsqu'il rencontre \0 et les caractères suivants sont ignorés. \0 lui-même n'occupe pas d'espace de stockage. Les avantages incluent une gestion fiable des chaînes, une efficacité améliorée (pas besoin d'analyser l'ensemble du tableau pour trouver la fin) et une facilité de comparaison et de manipulation.

Que signifient les arguments en Java Que signifient les arguments en Java Apr 25, 2024 pm 10:15 PM

args signifie arguments de ligne de commande en Java et est un tableau de chaînes contenant la liste des arguments transmis au programme lors de son démarrage. Il n'est disponible que dans la méthode main et sa valeur par défaut est un tableau vide, chaque paramètre étant accessible par index. args est utilisé pour recevoir et traiter les arguments de ligne de commande afin de configurer ou de fournir des données d'entrée au démarrage d'un programme.

Que signifient les arguments en Java Que signifient les arguments en Java May 07, 2024 am 02:24 AM

args est un tableau de paramètres spécial de la méthode main en Java, utilisé pour obtenir un tableau de chaînes de paramètres de ligne de commande ou d'entrée externe. En accédant au tableau args, le programme peut lire ces arguments et les traiter selon les besoins.

Comment trier les caractères chinois dans un environnement en langage C ? Comment trier les caractères chinois dans un environnement en langage C ? Feb 18, 2024 pm 02:10 PM

Comment implémenter la fonction de tri des caractères chinois dans un logiciel de programmation en langage C ? Dans la société moderne, la fonction de tri des caractères chinois est l’une des fonctions essentielles de nombreux logiciels. Que ce soit dans les logiciels de traitement de texte, les moteurs de recherche ou les systèmes de bases de données, les caractères chinois doivent être triés pour mieux afficher et traiter les données textuelles chinoises. En programmation en langage C, comment implémenter la fonction de tri des caractères chinois ? Une méthode est brièvement présentée ci-dessous. Tout d'abord, afin d'implémenter la fonction de tri des caractères chinois en langage C, nous devons utiliser la fonction de comparaison de chaînes. Couru

Application de la technologie de l'intelligence artificielle dans les fonctions PHP Application de la technologie de l'intelligence artificielle dans les fonctions PHP May 01, 2024 pm 01:15 PM

La technologie IA a été combinée avec les fonctions PHP pour améliorer les fonctionnalités de l'application. Les applications spécifiques de l'IA incluent : l'utilisation d'algorithmes d'apprentissage automatique pour classer le texte, tels que Naive Bayes. Effectuez une analyse de texte approfondie à l’aide de techniques de traitement du langage naturel telles que la segmentation et la radicalisation des mots.

Quel impact les fonctions C++ ont-elles sur les performances du programme ? Quel impact les fonctions C++ ont-elles sur les performances du programme ? Apr 12, 2024 am 09:39 AM

L'impact des fonctions sur les performances du programme C++ comprend la surcharge des appels de fonction, la surcharge des variables locales et de l'allocation d'objets : La surcharge des appels de fonction : y compris l'allocation de trame de pile, le transfert de paramètres et le transfert de contrôle, ce qui a un impact significatif sur les petites fonctions. Surcharge d'allocation de variables locales et d'objets : un grand nombre de créations et de destructions de variables locales ou d'objets peuvent entraîner un débordement de pile et une dégradation des performances.

See all articles