iOS 11, Swift 4.0
Trying to write a recursive function to show all the possible combinations of a string. I got this, but its not quite right since I get only 20 pa
Not a direct answer to your question but you can get all permutations (translated from java to Swift) as follow:
public extension RangeReplaceableCollection {
func permutations() -> [SubSequence] {
isEmpty ? [] : permutate(.init())
}
private func permutate(_ subSequence: SubSequence) -> [SubSequence] {
var permutations = isEmpty ? [subSequence] : []
indices.forEach {
permutations += (self[..<$0] + self[$0...].dropFirst())
.permutate(subSequence + CollectionOfOne(self[$0]))
}
return permutations
}
}
let str = "ABCD"
print(str.permutations()) // "["ABCD", "ABDC", "ACBD", "ACDB", "ADBC", "ADCB", "BACD", "BADC", "BCAD", "BCDA", "BDAC", "BDCA", "CABD", "CADB", "CBAD", "CBDA", "CDAB", "CDBA", "DABC", "DACB", "DBAC", "DBCA", "DCAB", "DCBA"]\n"
Per-mutating a substring
print("ABCD".dropLast().permutations()) // ["ABC", "ACB", "BAC", "BCA", "CAB", "CBA"]\n"
Since you said: Trying to write a recursive function to show all the possible combinations of a string
I think you could so something like this:
// Takes any collection of T and returns an array of permutations
func permute<C: Collection>(items: C) -> [[C.Iterator.Element]] {
var scratch = Array(items) // This is a scratch space for Heap's algorithm
var result: [[C.Iterator.Element]] = [] // This will accumulate our result
// Heap's algorithm
func heap(_ n: Int) {
if n == 1 {
result.append(scratch)
return
}
for i in 0..<n-1 {
heap(n-1)
let j = (n%2 == 1) ? 0 : i
scratch.swapAt(j, n-1)
}
heap(n-1)
}
// Let's get started
heap(scratch.count)
// And return the result we built up
return result
}
// We could make an overload for permute() that handles strings if we wanted
// But it's often good to be very explicit with strings, and make it clear
// that we're permuting Characters rather than something else.
let string = "ABCD"
let perms = permute(string.characters) // Get the character permutations
let permStrings = perms.map() { String($0) } // Turn them back into strings
print(permStrings) // output if you like
Extracted from this answer which helped me a lot once: Calculate all permutations of a string in Swift
This would give you a number of permutations.
I hope this helps you.