Printing out all the combinations of a string

后端 未结 2 563
陌清茗
陌清茗 2020-12-17 05:26

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

相关标签:
2条回答
  • 2020-12-17 05:47

    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"
    
    0 讨论(0)
  • 2020-12-17 05:47

    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.

    0 讨论(0)
提交回复
热议问题