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..f50451503b7f7 --- /dev/null +++ "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)) + } +}