J'ai aimé FBryant87 approche car elle est simple. Malheureusement, comme beaucoup d'autres "solutions", elle n'offre pas toutes les permutations ou, par exemple, d'un nombre entier s'il contient le même chiffre plus d'une fois. Prenons l'exemple de 656123. La ligne :
var tail = chars.Except(new List<char>(){c});
L'utilisation de Except entraîne la suppression de toutes les occurrences, c'est-à-dire que lorsque c = 6, deux chiffres sont supprimés et il nous reste par exemple 5123. Comme aucune des solutions que j'ai essayées n'a résolu ce problème, j'ai décidé d'essayer de le résoudre moi-même en FBryant87 comme base. Voici ce que j'ai trouvé :
private static List<string> FindPermutations(string set)
{
var output = new List<string>();
if (set.Length == 1)
{
output.Add(set);
}
else
{
foreach (var c in set)
{
// Remove one occurrence of the char (not all)
var tail = set.Remove(set.IndexOf(c), 1);
foreach (var tailPerms in FindPermutations(tail))
{
output.Add(c + tailPerms);
}
}
}
return output;
}
Je supprime simplement la première occurrence trouvée en utilisant .Remove et .IndexOf. Cela semble fonctionner comme prévu, du moins pour mon utilisation. Je suis sûr que cela pourrait être plus intelligent.
Une chose à noter cependant : La liste résultante peut contenir des doublons. Veillez donc à ce que la méthode renvoie un HashSet, par exemple, ou supprimez les doublons après le retour en utilisant la méthode de votre choix.
1 votes
Voici une question sur les permutations avec quelques bonnes réponses explicatives, y compris un graphique mais pas en C#.