Obecnie próbuję utworzyć Set
wszystkich możliwych kombinacji z Array
z Strings
, gdy każdy element zawiera tylko jedną literę.Jak wygenerować wszystkie możliwe kombinacje?
Sam w sobie może zawierać tę samą literę dwa razy lub nawet więcej i powinny one być używane tak często, jak się pojawią.
Później Set
powinien zawierać wszystkie kombinacje od minimum 2 liter do długości podanego Array
.
Szukałem tutaj na stackoverflow, ale tylko znaleziono funkcje permutacji, które ignorują fakt, że każda litera powinna być używana tak często, jak się pojawiają.
To mój pierwszy Swift 2 projekt, więc proszę wybaczyć mój greenhornish-ności :)
Co chcę
var array = ["A", "B", "C","D"]
var combinations: Set<String>
... <MAGIC> ...
print(combinations)
// "AB", "ABC", "ABD", "ABCD", "ABDC", "AC", "ACB", "ACD", "ACBD", "ACDB", and so on ...
Moje obecne podejście
func permuation(arr: Array<String>) {
for (index, elementA) in arr.enumerate() {
//1..2..3..4
var tmpString = elementA
var tmpArray = arr
tmpArray.removeAtIndex(index)
for (index2, elementB) in tmpArray.enumerate() {
// 12..13..14
var tmpString2 = tmpString + elementB
var tmpArray2 = tmpArray
//[3,4]
tmpArray2.removeAtIndex(index2)
results.append(tmpString2)
}
}
}
permuation(array)
print(results)
// "["AB", "AC", "AD", "BA", "BC", "BD", "CA", "CB", "CD", "DA", "DB", "DC"]"
I Wiem, że jest tak strasznie źle na tak wiele sposobów, ale utknąłem z tym kodem i nie wiem jak dodać funkcję rekursywną.
Zauważyłem, że jeśli zdać * jeden * '' inout' set' jako parametr do wywołań rekurencyjnych wówczas metoda staje się znacznie szybciej (i rzeczywiście szybciej niż ja, szczerze mówiąc :) –
To jak ja pierwotnie to napisałem. Powinienem dodać tę wersję do odpowiedzi. – vacawama
Dziękuję wam obu! Chciałbym przyjąć obie odpowiedzi, ale nie jest to możliwe. :) Jednakże, jeśli chciałbyś edytować swój jak wspomniano, oznaczałbym to jako poprawny. – dschu