算法 - 图论04(Swift版本)

3 阅读1分钟

题目1:127. 单词接龙

讲解

class Solution {
    func ladderLength(_ beginWord: String, _ endWord: String, _ wordList: [String]) -> Int {
        guard wordList.contains(endWord) else { return 0 }
        var visitMap = [String: Int]()
        var queue = [beginWord]
        let wordSet = Set(wordList)
        visitMap[beginWord] = 1
        while !queue.isEmpty {
            let node = queue.removeFirst()
            let length = visitMap[node]!
            // 遍历每个字符位置
            for i in 0..<node.count {
                var chars = Array(node)
                // 替换成 'a' - 'z' 的字符
                for scalar in UnicodeScalar("a").value...UnicodeScalar("z").value {
                    chars[i] = Character(UnicodeScalar(scalar)!)
                    let newString = String(chars)
                    if newString == endWord, wordSet.contains(newString) {
                        return length + 1
                    }
                    if wordSet.contains(newString), visitMap[newString] == nil {
                        queue.append(newString)
                        visitMap[newString] = length + 1
                    }
                }
            }
        }
        return 0
    }
}

题目2:有向图的完全可达性

讲解

func reachable(_ n: Int, _ grid: [[Int]]) -> Bool {
    var map = Array(repeating: Array(repeating: 0, count: n + 1), count: n + 1)
    grid.forEach { map[$0[0]][$0[1]] = 1 }
    var visited = [(Int, Int)]()
    print("\(map)")
    func dfs(_ cur: (Int, Int)) {
        if visited.contains { cur.0 == $0.0 && cur.1 == $0.1} {
            return
        }
        visited.append(cur)
        for i in 1...n {
            if map[cur.1][i] == 0 { continue }
            dfs((cur.1, i))
        }
    }
    dfs((1, 1))
    let set = visited.map { $0.1 }
    for i in 1...n {
        if !set.contains(i) {
            return false
        }
    }
    return true
}

print("\(reachable(4, [[1, 2], [2, 1], [1, 3], [2, 4]]))")
print("\(reachable(8, [[1, 2], [2, 5], [5, 4], [4, 5], [4, 3], [6, 7], [6, 8], [7, 8]]))")

题目3:463. 岛屿的周长

讲解

class Solution {
    func islandPerimeter(_ grid: [[Int]]) -> Int {
        var res = 0
        let directions = [(1, 0), (0, 1), (-1, 0), (0, -1)]
        for i in 0..<grid.count {
            for j in 0..<grid[0].count {
                if grid[i][j] == 0 { continue }
                for dir in directions {
                    let nexti = i + dir.0
                    let nextj = j + dir.1
                    if nexti < 0 || nextj < 0 || nexti == grid.count || nextj == grid[0].count || grid[nexti][nextj] == 0 {
                        res += 1
                    }
                }
            }
        }
        return res
    }
}