Я использую оператор enum и switch в попытке отобразить буквенные комбинации в заданную строку чисел.Это похоже на алгоритм телефонных слов, где вам дается номер телефона, и вы должны найти возможные слова, сопоставленные с этим номером.Здесь я не пытаюсь найти настоящие английские слова, обязательно.Скорее, просто базовые String
букв.
Приведенный ниже код почему-то не печатается в игровых площадках.
enum Dialpad : Int {
case zero, one, two, three, four
var letters : [String] {
switch self {
case .zero,.one:
return []
case .two:
return ["a","b","c"]
case .three:
return ["d","e","f"]
case .four:
return ["g","h","i"]
}
}
}
Вот рекурсивная функция, объединяющая массивы Character
в String
массивы.
func comboArray(_ arrays:[[String]], n:Int,set:inout Set<String>) {
if n >= arrays.count { return }
let array = arrays[n]
if set.isEmpty {
set = Set(array)
} else {
set.forEach { (c1) in
array.forEach({ (c2) in
set.insert(c1+c2)
})
if !array.isEmpty {
set.remove(c1)
}
}
}
comboArray(arrays, n: n+1, set: &set)
}
Эта функция должна принимать число и сопоставлять его с соответствующими буквами клавиатуры набора номера.
func dialPadLetters(number:Int) -> Set<String> {
let stringNumber = String(number)
var arrayLetter : [Array<String>] = []
for c in stringNumber {
let n = Int(String(c))!
let letters = Dialpad(rawValue: n)!.letters
arrayLetter.append(letters)
}
var mySet : Set<String> = []
comboArray(arrayLetter, n: 0, set: &mySet)
return mySet
}
Затем я пытаюсь напечатать возможные комбинации букв a, b,c, d, e, f, g, h, i, поскольку заданные номера панели набора номера - 0, 1, 2, 3, 4. (Обратите внимание, что 0 и 1 не содержат букв панели набора номера.)
let theSet = dialPadLetters(number: 1234)
print("\(theSet)")