File tree Expand file tree Collapse file tree 2 files changed +119
-0
lines changed
lcof2/剑指 Offer II 109. 开密码锁 Expand file tree Collapse file tree 2 files changed +119
-0
lines changed Original file line number Diff line number Diff 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 -->
Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments