Я сейчас пытаюсь сделать Set
из всех возможных комбинаций из Array
из Strings
, каждый из которых содержит только одну букву.Как сгенерировать все возможные комбинации?
Array
сам может содержать одну и ту же букву дважды или даже больше, и их следует использовать так часто, как они происходят.
В дальнейшем Set
должен содержать все комбинации от минимум 2 букв до длины данного Array
.
Я искал здесь в stackoverflow, но нашел только функции перестановки, которые игнорируют тот факт, что каждая буква должна использоваться только так часто, как они происходят.
Это мой первый проект Swift 2, поэтому, пожалуйста, простите мой greenhornish-Несс :)
То, что я хочу
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 ...
Мой текущий подход
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 знаете, это так ужасно неправильно во многих отношениях, но я застрял в этом коде и не знаю, h ow добавить рекурсивную функциональность.
Я заметил, что если вы передаете * одиночный * 'set' как' inout' параметра рекурсивных вызовов, то ваш метод становится намного быстрее (и на самом деле быстрее, чем у меня, если честно :) –
Вот как я первоначально написал его. Я должен добавить эту версию к ответу. – vacawama
Спасибо вам обоим! Я хотел бы принять оба ответа, но это невозможно. :) Однако, если вы хотите отредактировать свои, как уже упоминалось, я бы назвал это правильным. – dschu