From 8c803a28e4721a8af0aded7754ba459b642c4d50 Mon Sep 17 00:00:00 2001 From: Lanre Adedara Date: Wed, 30 Oct 2024 08:28:34 +0100 Subject: [PATCH 1/2] feat: add swift implementation to lcof2 problem: No.109 --- .../README.md" | 62 +++++++++++++++++++ .../Solution.swift" | 0 2 files changed, 62 insertions(+) create mode 100644 "lcof2/\345\211\221\346\214\207 Offer II 109. \345\274\200\345\257\206\347\240\201\351\224\201/Solution.swift" diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 109. \345\274\200\345\257\206\347\240\201\351\224\201/README.md" "b/lcof2/\345\211\221\346\214\207 Offer II 109. \345\274\200\345\257\206\347\240\201\351\224\201/README.md" index d4b88475a5771..e1c7c235fe3bb 100644 --- "a/lcof2/\345\211\221\346\214\207 Offer II 109. \345\274\200\345\257\206\347\240\201\351\224\201/README.md" +++ "b/lcof2/\345\211\221\346\214\207 Offer II 109. \345\274\200\345\257\206\347\240\201\351\224\201/README.md" @@ -277,6 +277,68 @@ func openLock(deadends []string, target string) int { } ``` +#### Swift + +```swift +class Solution { + func openLock(_ deadends: [String], _ target: String) -> Int { + let deadSet = Set(deadends) + if deadSet.contains(target) || deadSet.contains("0000") { + return -1 + } + if target == "0000" { + return 0 + } + + var visited = Set() + var queue = ["0000"] + visited.insert("0000") + var step = 0 + + while !queue.isEmpty { + step += 1 + for _ in 0.. [String] { + var neighbors = [String]() + var chars = Array(lock) + for i in 0..<4 { + let original = chars[i] + chars[i] = prevChar(original) + neighbors.append(String(chars)) + chars[i] = nextChar(original) + neighbors.append(String(chars)) + chars[i] = original + } + return neighbors + } + + private func prevChar(_ c: Character) -> Character { + return c == "0" ? "9" : Character(UnicodeScalar(c.asciiValue! - 1)) + } + + private func nextChar(_ c: Character) -> Character { + return c == "9" ? "0" : Character(UnicodeScalar(c.asciiValue! + 1)) + } +} +``` + diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 109. \345\274\200\345\257\206\347\240\201\351\224\201/Solution.swift" "b/lcof2/\345\211\221\346\214\207 Offer II 109. \345\274\200\345\257\206\347\240\201\351\224\201/Solution.swift" new file mode 100644 index 0000000000000..e69de29bb2d1d From 4130b4a9eb1eb34571dda432f47fa24b8599d9db Mon Sep 17 00:00:00 2001 From: Lanre Adedara Date: Wed, 30 Oct 2024 08:30:56 +0100 Subject: [PATCH 2/2] feat: add swift implementation to lcof2 problem: No.109 --- .../Solution.swift" | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 109. \345\274\200\345\257\206\347\240\201\351\224\201/Solution.swift" "b/lcof2/\345\211\221\346\214\207 Offer II 109. \345\274\200\345\257\206\347\240\201\351\224\201/Solution.swift" index e69de29bb2d1d..f50451503b7f7 100644 --- "a/lcof2/\345\211\221\346\214\207 Offer II 109. \345\274\200\345\257\206\347\240\201\351\224\201/Solution.swift" +++ "b/lcof2/\345\211\221\346\214\207 Offer II 109. \345\274\200\345\257\206\347\240\201\351\224\201/Solution.swift" @@ -0,0 +1,57 @@ +class Solution { + func openLock(_ deadends: [String], _ target: String) -> Int { + let deadSet = Set(deadends) + if deadSet.contains(target) || deadSet.contains("0000") { + return -1 + } + if target == "0000" { + return 0 + } + + var visited = Set() + var queue = ["0000"] + visited.insert("0000") + var step = 0 + + while !queue.isEmpty { + step += 1 + for _ in 0.. [String] { + var neighbors = [String]() + var chars = Array(lock) + for i in 0..<4 { + let original = chars[i] + chars[i] = prevChar(original) + neighbors.append(String(chars)) + chars[i] = nextChar(original) + neighbors.append(String(chars)) + chars[i] = original + } + return neighbors + } + + private func prevChar(_ c: Character) -> Character { + return c == "0" ? "9" : Character(UnicodeScalar(c.asciiValue! - 1)) + } + + private func nextChar(_ c: Character) -> Character { + return c == "9" ? "0" : Character(UnicodeScalar(c.asciiValue! + 1)) + } +}