Algorithme pour générer toutes les combinaisons d'une chaîne
J'ai trouvé un lien sur internet qui montre un algorithme permettant de générer toutes les combinaisons d'une chaîne: http://www.mytechinterviews.com/combinations-of-a-string
Algorithme est copié ci-dessous.
void combine(String instr, StringBuffer outstr, int index)
{
for (int i = index; i < instr.length(); i++)
{
outstr.append(instr.charAt(i));
System.out.println(outstr);
combine(instr, outstr, i + 1);
outstr.deleteCharAt(outstr.length() - 1);
}
}
combine("abc", new StringBuffer(), 0);
Ce que je ne comprends pas, c'est la ligne:
outstr.deleteCharAt(outstr.length() - 1);
Si je supprime cette ligne, le programme de toute évidence ne fonctionne plus, mais pourquoi est-ce nécessaire en premier lieu? Je comprends le récursive idée de l'endroit où nous faisons varier d'un caractère de début et de manière récursive sur les autres personnages, mais le deleteChar ligne ne semblent pas correspondre logiquement n'importe où. Quelle était la raison de l'ajout de la outstr.deleteCharAt ligne?
source d'informationauteur john | 2012-01-23
Vous devez vous connecter pour publier un commentaire.
L'appel de
outstr.deleteCharAt
compteurs de l'effet deoutstr.append
par la suppression du dernier caractère de laoutstr
.Chaque itération de boucle se déroule comme suit:
i+1
Façon la plus simple de calculer les combinaisons possibles des chaînes est ici ...
Mathématiquement pour trouver la R de combinaisons dans un lot de N = Rcn
Donc, ce que nous trouvons ici, c'est que toutes les combinaisons possibles = Nc0 + Nc1 .... + Ncn = 2 Pow N
Ainsi, vous obtenez 2 Pow N combinaisons de mot de longueur N caractères.
Si vous représenter 1 à 2 Pow N des entiers en binaire, et le lieu de votre personnage à l'endroit où 1 est présent, enfin, vous obtiendrez la solution.
Exemple:
D'entrée : ABC
Solution :
ABC longueur est de 3. Tellement de combinaisons possibles de 2 Pow 3 = 8
Si 0 - 8 représenté en binaire
000 =
001 = C
010 = B
011 = BC
100 = Un
101 = AC
110 = AB
111 = ABC
toutes les combinaisons possibles sont indiquées ci-dessus.
Soldes la première ligne du corps de la boucle, de la restauration outstr à ce qu'il était dans le haut du corps de la boucle (en enlevant le caractère de l'instrument qui a été ajouté).
Il s'adapte très logiquement. Vous voyez ce que nous avons ici est un algorithme récursif. À chaque étape de position
i
nous a mis une lettre de la chaîne, puis appeler la fonction récursive pour mettre une autre lettre sur la position suivante. Cependant, quand nous serons de retour à partir de la récursivité, nous avons besoin de supprimer le caractère nous mettons d'abord, de sorte que nous pouvons le remplacer par la suivante dans la séquence. Exemple:Code ci-dessous est de générer de permutation et de combinaison de chaîne, fondamentalement, le concept est de choisir un caractère à la fois:
signifie que vous avez
L'itération de la boucle ne s'arrête pas après la fonction récursive appeler si vous avez besoin d'effacer le dernier caractère dans le tampon de sortie parce que vous ne voulez pas d'obtenir
Dans un graphe théorie, il serait un court-circuit.
Voici le code C++ sans le difficile retour en arrière étape OP question.
J'espère que cela reflète mieux l'esprit de combinaisons.
Nous pouvons générer tous les sous-chaînes d'une chaîne en utilisant les bits concept qui a été mentionné précédemment. Voici le code (en C++ , mais vous voyez l'idée) pour ce faire : -
Par exemple;- String s = abc ,