Maison > Article > développement back-end > Nombre minimum de caractères à supprimer pour trier une chaîne binaire afin qu'elle soit par ordre croissant
En informatique, la manipulation de chaînes est un sujet important, impliquant des opérations telles que l'épissage, les sous-chaînes et l'inversion. Un problème courant lié à la manipulation de chaînes consiste à supprimer tous les zéros d’une chaîne binaire. Dans cet article, nous discuterons d'un algorithme qui utilise un nombre minimum de retournements de paires non adjacentes pour résoudre ce problème.
Étant donné une chaîne binaire, nous devons supprimer tous les 0 de la chaîne en utilisant un nombre minimum de retournements de paires non adjacentes. Flip est défini comme la sélection de deux personnages adjacents et leur échange. En d’autres termes, nous devons trouver le nombre minimum de retournements requis pour amener tous les 0 de la chaîne à la fin de la chaîne.
Nous pouvons utiliser un algorithme glouton pour résoudre ce problème. Nous pouvons commencer par le côté gauche de la chaîne et garder une trace du dernier index où nous avons basculé 0 jusqu'à la fin. Pour chaque 0 rencontré, nous échangeons sa position avec le dernier 0 inversé, en le déplaçant à la fin de la chaîne. Si 1 est rencontré, nous passons simplement à l’index suivant.
Regardons l'algorithme en détail -
Initialisez les deux variables "lastFlipped" et "flipCount" à -1 et 0 respectivement.
Traversez une chaîne binaire de gauche à droite.
Si le caractère actuel est "0", échangez-le avec le caractère à l'index "lastFlipped + 1" et incrémentez la variable "lastFlipped".
Incrémentez la variable "flipCount" pour chaque opération d'échange.
Une fois le parcours terminé, tous les 0 seront à la fin de la chaîne et "flipCount" contiendra le nombre minimum de retournements requis pour supprimer tous les 0.
C'est le code C++ utilisé pour implémenter l'algorithme ci-dessus -
#include <iostream> #include <string> using namespace std; int minNonAdjacentPairFlips(string s) { int lastFlipped = -1; int flipCount = 0; for (int i = 0; i < s.length(); i++) { if (s[i] == '0') { swap(s[i], s[lastFlipped + 1]); lastFlipped++; flipCount++; } } return flipCount; } int main() { string s = "100101000"; cout << "Binary String: " << s << endl; cout << "Minimum Non-adjacent Pair Flips: " << minNonAdjacentPairFlips(s) << endl; return 0; }
Binary String: 100101000 Minimum Non-adjacent Pair Flips: 6
Prenons la chaîne binaire « 100101000 » comme exemple. Nous devons supprimer tous les 0 de la chaîne en utilisant un nombre minimum de paires non adjacentes.
Initialement, "lastFlipped" et "flipCount" sont respectivement définis sur -1 et 0.
Nous commençons à parcourir la chaîne de gauche à droite.
A l'indice 1, on rencontre un '0'. Nous l'échangeons avec le caractère à l'index "lastFlipped + 1" (c'est-à-dire l'index 0) et incrémentons "lastFlipped" à 0. La chaîne devient « 010101000 ». "flipCount" est augmenté à 1.
À l'indice 4, nous rencontrons un autre « 0 ». Nous l'échangeons avec le caractère à l'index "lastFlipped + 1" (c'est-à-dire l'index 1) et incrémentons "lastFlipped" à 1. La chaîne devient « 011010000 ». "flipCount" est augmenté à 2.
A l'indice 5, on rencontre un '1'. On passe juste à l'index suivant
Dans cet article, nous discutons d'un algorithme permettant de supprimer tous les 0 d'une chaîne binaire en utilisant un nombre minimum de retournements de paires non adjacentes. L’approche utilisée par cet algorithme est gourmande, ce qui le rend efficace et simple à mettre en œuvre. Nous fournissons également du code C++ pour implémenter l'algorithme ainsi que des exemples de cas de test.
Ce problème peut également être résolu à l'aide de la programmation dynamique, mais l'algorithme glouton offre une solution plus simple et plus rapide. La complexité temporelle de cet algorithme est O(n), où n est la longueur de la chaîne binaire.
En résumé, l'algorithme de retournement de paires non adjacentes minimales est un outil utile dans les opérations sur les chaînes et peut être appliqué à diverses situations.
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!