Commencez par convertir la chaîne de caractères en un ensemble de caractères uniques et de numéros d'occurrence, par exemple BANANA -> (3, A),(1,B),(2,N). (Cela peut être fait en triant la chaîne et en regroupant les lettres). Ensuite, pour chaque lettre de l'ensemble, ajoutez cette lettre à toutes les permutations de l'ensemble contenant une lettre de moins (notez la récursion). En poursuivant l'exemple de la "BANANE", nous avons : permutations((3,A),(1,B),(2,N)) = A :(permutations((2,A),(1,B),(2,N)) ++ B :(permutations((3,A),(2,N)) ++ N :(permutations((3,A),(1,B),(1,N))
Voici une implémentation fonctionnelle en Haskell :
circularPermutations::[a]->[[a]]
circularPermutations xs = helper [] xs []
where helper acc [] _ = acc
helper acc (x:xs) ys =
helper (((x:xs) ++ ys):acc) xs (ys ++ [x])
nrPermutations::[(Int, a)]->[[a]]
nrPermutations x | length x == 1 = [take (fst (head x)) (repeat (snd (head x)))]
nrPermutations xs = concat (map helper (circularPermutations xs))
where helper ((1,x):xs) = map ((:) x)(nrPermutations xs)
helper ((n,x):xs) = map ((:) x)(nrPermutations ((n - 1, x):xs))