讲解
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)、
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]]))")
讲解
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
}
}