Skip to content

Commit 4130b4a

Browse files
committed
feat: add swift implementation to lcof2 problem: No.109
1 parent 8c803a2 commit 4130b4a

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
class Solution {
2+
func openLock(_ deadends: [String], _ target: String) -> Int {
3+
let deadSet = Set(deadends)
4+
if deadSet.contains(target) || deadSet.contains("0000") {
5+
return -1
6+
}
7+
if target == "0000" {
8+
return 0
9+
}
10+
11+
var visited = Set<String>()
12+
var queue = ["0000"]
13+
visited.insert("0000")
14+
var step = 0
15+
16+
while !queue.isEmpty {
17+
step += 1
18+
for _ in 0..<queue.count {
19+
let status = queue.removeFirst()
20+
for neighbor in getNeighbors(status) {
21+
if visited.contains(neighbor) || deadSet.contains(neighbor) {
22+
continue
23+
}
24+
if neighbor == target {
25+
return step
26+
}
27+
queue.append(neighbor)
28+
visited.insert(neighbor)
29+
}
30+
}
31+
}
32+
33+
return -1
34+
}
35+
36+
private func getNeighbors(_ lock: String) -> [String] {
37+
var neighbors = [String]()
38+
var chars = Array(lock)
39+
for i in 0..<4 {
40+
let original = chars[i]
41+
chars[i] = prevChar(original)
42+
neighbors.append(String(chars))
43+
chars[i] = nextChar(original)
44+
neighbors.append(String(chars))
45+
chars[i] = original
46+
}
47+
return neighbors
48+
}
49+
50+
private func prevChar(_ c: Character) -> Character {
51+
return c == "0" ? "9" : Character(UnicodeScalar(c.asciiValue! - 1))
52+
}
53+
54+
private func nextChar(_ c: Character) -> Character {
55+
return c == "9" ? "0" : Character(UnicodeScalar(c.asciiValue! + 1))
56+
}
57+
}

0 commit comments

Comments
 (0)