Skip to content

Commit a803a2b

Browse files
authored
feat: add swift implementation to lcci problem: No.17.22 (doocs#2817)
1 parent cde7151 commit a803a2b

File tree

3 files changed

+153
-0
lines changed

3 files changed

+153
-0
lines changed

lcci/17.22.Word Transformer/README.md

+52
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,58 @@ function findLadders(beginWord: string, endWord: string, wordList: string[]): st
257257
}
258258
```
259259

260+
```swift
261+
class Solution {
262+
private var ans: [String] = []
263+
private var wordList: [String] = []
264+
private var endWord: String = ""
265+
private var vis: [Bool] = []
266+
267+
func findLadders(_ beginWord: String, _ endWord: String, _ wordList: [String]) -> [String] {
268+
self.wordList = wordList
269+
self.endWord = endWord
270+
ans.append(beginWord)
271+
vis = Array(repeating: false, count: wordList.count)
272+
return dfs(beginWord) ? ans : []
273+
}
274+
275+
private func dfs(_ s: String) -> Bool {
276+
if s == endWord {
277+
return true
278+
}
279+
for i in 0..<wordList.count {
280+
let t = wordList[i]
281+
if vis[i] || !check(s, t) {
282+
continue
283+
}
284+
vis[i] = true
285+
ans.append(t)
286+
if dfs(t) {
287+
return true
288+
}
289+
ans.removeLast()
290+
}
291+
return false
292+
}
293+
294+
private func check(_ s: String, _ t: String) -> Bool {
295+
if s.count != t.count {
296+
return false
297+
}
298+
var cnt = 0
299+
for (sc, tc) in zip(s, t) {
300+
if sc != tc {
301+
cnt += 1
302+
if cnt > 1 {
303+
return false
304+
}
305+
}
306+
}
307+
return cnt == 1
308+
}
309+
}
310+
```
311+
260312
<!-- tabs:end -->
261313

262314
<!-- end -->

lcci/17.22.Word Transformer/README_EN.md

+52
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,58 @@ function findLadders(beginWord: string, endWord: string, wordList: string[]): st
274274
}
275275
```
276276

277+
```swift
278+
class Solution {
279+
private var ans: [String] = []
280+
private var wordList: [String] = []
281+
private var endWord: String = ""
282+
private var vis: [Bool] = []
283+
284+
func findLadders(_ beginWord: String, _ endWord: String, _ wordList: [String]) -> [String] {
285+
self.wordList = wordList
286+
self.endWord = endWord
287+
ans.append(beginWord)
288+
vis = Array(repeating: false, count: wordList.count)
289+
return dfs(beginWord) ? ans : []
290+
}
291+
292+
private func dfs(_ s: String) -> Bool {
293+
if s == endWord {
294+
return true
295+
}
296+
for i in 0..<wordList.count {
297+
let t = wordList[i]
298+
if vis[i] || !check(s, t) {
299+
continue
300+
}
301+
vis[i] = true
302+
ans.append(t)
303+
if dfs(t) {
304+
return true
305+
}
306+
ans.removeLast()
307+
}
308+
return false
309+
}
310+
311+
private func check(_ s: String, _ t: String) -> Bool {
312+
if s.count != t.count {
313+
return false
314+
}
315+
var cnt = 0
316+
for (sc, tc) in zip(s, t) {
317+
if sc != tc {
318+
cnt += 1
319+
if cnt > 1 {
320+
return false
321+
}
322+
}
323+
}
324+
return cnt == 1
325+
}
326+
}
327+
```
328+
277329
<!-- tabs:end -->
278330

279331
<!-- end -->
+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
class Solution {
2+
private var ans: [String] = []
3+
private var wordList: [String] = []
4+
private var endWord: String = ""
5+
private var vis: [Bool] = []
6+
7+
func findLadders(_ beginWord: String, _ endWord: String, _ wordList: [String]) -> [String] {
8+
self.wordList = wordList
9+
self.endWord = endWord
10+
ans.append(beginWord)
11+
vis = Array(repeating: false, count: wordList.count)
12+
return dfs(beginWord) ? ans : []
13+
}
14+
15+
private func dfs(_ s: String) -> Bool {
16+
if s == endWord {
17+
return true
18+
}
19+
for i in 0..<wordList.count {
20+
let t = wordList[i]
21+
if vis[i] || !check(s, t) {
22+
continue
23+
}
24+
vis[i] = true
25+
ans.append(t)
26+
if dfs(t) {
27+
return true
28+
}
29+
ans.removeLast()
30+
}
31+
return false
32+
}
33+
34+
private func check(_ s: String, _ t: String) -> Bool {
35+
if s.count != t.count {
36+
return false
37+
}
38+
var cnt = 0
39+
for (sc, tc) in zip(s, t) {
40+
if sc != tc {
41+
cnt += 1
42+
if cnt > 1 {
43+
return false
44+
}
45+
}
46+
}
47+
return cnt == 1
48+
}
49+
}

0 commit comments

Comments
 (0)