Skip to content

Commit 1768a6e

Browse files
authored
feat: add swift implementation to lcof2 problem: No.109 (doocs#3687)
1 parent 683eeef commit 1768a6e

File tree

2 files changed

+119
-0
lines changed

2 files changed

+119
-0
lines changed

lcof2/剑指 Offer II 109. 开密码锁/README.md

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,68 @@ func openLock(deadends []string, target string) int {
277277
}
278278
```
279279

280+
#### Swift
281+
282+
```swift
283+
class Solution {
284+
func openLock(_ deadends: [String], _ target: String) -> Int {
285+
let deadSet = Set(deadends)
286+
if deadSet.contains(target) || deadSet.contains("0000") {
287+
return -1
288+
}
289+
if target == "0000" {
290+
return 0
291+
}
292+
293+
var visited = Set<String>()
294+
var queue = ["0000"]
295+
visited.insert("0000")
296+
var step = 0
297+
298+
while !queue.isEmpty {
299+
step += 1
300+
for _ in 0..<queue.count {
301+
let status = queue.removeFirst()
302+
for neighbor in getNeighbors(status) {
303+
if visited.contains(neighbor) || deadSet.contains(neighbor) {
304+
continue
305+
}
306+
if neighbor == target {
307+
return step
308+
}
309+
queue.append(neighbor)
310+
visited.insert(neighbor)
311+
}
312+
}
313+
}
314+
315+
return -1
316+
}
317+
318+
private func getNeighbors(_ lock: String) -> [String] {
319+
var neighbors = [String]()
320+
var chars = Array(lock)
321+
for i in 0..<4 {
322+
let original = chars[i]
323+
chars[i] = prevChar(original)
324+
neighbors.append(String(chars))
325+
chars[i] = nextChar(original)
326+
neighbors.append(String(chars))
327+
chars[i] = original
328+
}
329+
return neighbors
330+
}
331+
332+
private func prevChar(_ c: Character) -> Character {
333+
return c == "0" ? "9" : Character(UnicodeScalar(c.asciiValue! - 1))
334+
}
335+
336+
private func nextChar(_ c: Character) -> Character {
337+
return c == "9" ? "0" : Character(UnicodeScalar(c.asciiValue! + 1))
338+
}
339+
}
340+
```
341+
280342
<!-- tabs:end -->
281343

282344
<!-- solution:end -->
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)