Skip to content

Commit 68ad375

Browse files
committed
Swift Implementation for LCCI 17.22
1 parent cde7151 commit 68ad375

File tree

3 files changed

+177
-0
lines changed

3 files changed

+177
-0
lines changed

lcci/17.22.Word Transformer/README.md

+60
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,66 @@ 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+
init(wordList: [String], endWord: String) {
268+
self.wordList = wordList
269+
self.endWord = endWord
270+
self.vis = Array(repeating: false, count: wordList.count)
271+
}
272+
273+
func findLadders(_ beginWord: String) -> [String] {
274+
ans.append(beginWord)
275+
if dfs(beginWord) {
276+
return ans
277+
} else {
278+
return []
279+
}
280+
}
281+
282+
private func dfs(_ s: String) -> Bool {
283+
if s == endWord {
284+
return true
285+
}
286+
for i in 0..<wordList.count {
287+
let t = wordList[i]
288+
if vis[i] || !check(s, t) {
289+
continue
290+
}
291+
vis[i] = true
292+
ans.append(t)
293+
if dfs(t) {
294+
return true
295+
}
296+
ans.removeLast()
297+
vis[i] = false
298+
}
299+
return false
300+
}
301+
302+
private func check(_ s: String, _ t: String) -> Bool {
303+
if s.count != t.count {
304+
return false
305+
}
306+
var count = 0
307+
for (sc, tc) in zip(s, t) {
308+
if sc != tc {
309+
count += 1
310+
if count > 1 {
311+
return false
312+
}
313+
}
314+
}
315+
return count == 1
316+
}
317+
}
318+
```
319+
260320
<!-- tabs:end -->
261321

262322
<!-- end -->

lcci/17.22.Word Transformer/README_EN.md

+60
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,66 @@ 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+
init(wordList: [String], endWord: String) {
285+
self.wordList = wordList
286+
self.endWord = endWord
287+
self.vis = Array(repeating: false, count: wordList.count)
288+
}
289+
290+
func findLadders(_ beginWord: String) -> [String] {
291+
ans.append(beginWord)
292+
if dfs(beginWord) {
293+
return ans
294+
} else {
295+
return []
296+
}
297+
}
298+
299+
private func dfs(_ s: String) -> Bool {
300+
if s == endWord {
301+
return true
302+
}
303+
for i in 0..<wordList.count {
304+
let t = wordList[i]
305+
if vis[i] || !check(s, t) {
306+
continue
307+
}
308+
vis[i] = true
309+
ans.append(t)
310+
if dfs(t) {
311+
return true
312+
}
313+
ans.removeLast()
314+
vis[i] = false
315+
}
316+
return false
317+
}
318+
319+
private func check(_ s: String, _ t: String) -> Bool {
320+
if s.count != t.count {
321+
return false
322+
}
323+
var count = 0
324+
for (sc, tc) in zip(s, t) {
325+
if sc != tc {
326+
count += 1
327+
if count > 1 {
328+
return false
329+
}
330+
}
331+
}
332+
return count == 1
333+
}
334+
}
335+
```
336+
277337
<!-- tabs:end -->
278338

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

0 commit comments

Comments
 (0)