算法 - 回溯01(Swift版本)

115 阅读1分钟

回溯算法理论基础

题目1: 第77题. 组合

讲解     
leetcode

class Solution {
    var result = [[Int]]()
    var path = [Int]()
    func combine(_ n: Int, _ k: Int) -> [[Int]] {
        combineBacktrack(n, k, 1)
        return result
    }

    func combineBacktrack(_ n: Int, _ k: Int, _ startIndex: Int) {
        if k == path.count { 
            return result.append(path) 
        }
        let end = n - (k - path.count) + 1
        if startIndex > end { return }
        for i in startIndex...end {
            path.append(i)
            combineBacktrack(n, k, i + 1)
            path.removeLast()
        }
    }
}

题目2:216.组合总和III

讲解     
leetcode

class Solution {
    var set = [Int]()
    var result = [[Int]]()
    func combinationSum3(_ k: Int, _ n: Int) -> [[Int]] {
        backtrack(k, n, 1)        
        return result
    }

    func backtrack(_ k: Int, _ n: Int, _ start: Int) { 
        var sum = 0
        for i in set { sum += i }
        if set.count == k {
            if sum == n {
                result.append(set)
            }
            return
        }
        let end = 9 - (k - set.count) + 1
        if start > end || sum > n { return }
        for i in start...end {
            set.append(i)
            backtrack(k, n, i + 1)
            set.removeLast()
        }
    }
}

题目3: 17.电话号码的字母组合

讲解     
leetcode

class Solution {
    let map = [2: ["a","b","c"], 3: ["d","e","f"], 4: ["g","h","i"], 5: ["j", "k", "l"], 6: ["m", "n", "o"], 7: ["p", "q", "r", "s"], 8: ["t", "u", "v"], 9: ["w", "x", "y", "z"]]
    var result = [String]()
    var path = [String]()
    func letterCombinations(_ digits: String) -> [String] {
        if digits.isEmpty { return [] }
        recursive(Array(digits), 0)
        return result
    }

    func recursive(_ set: [Character], _ index: Int) {
        if path.count == set.count {
            result.append(path.joined())
            return
        }
        let num = Int(String(set[index])) ?? 0
        let chars = map[num] ?? []
            print("\(chars) \(index)")
        for i in 0..<chars.count {
            path.append(chars[i])
            recursive(set, index + 1)
            path.removeLast()
        }
    }
}