10
10
11
11
class WordLadder {
12
12
func ladderLength( _ beginWord: String , _ endWord: String , _ wordList: [ String ] ) -> Int {
13
- var words = Set ( wordList)
14
- var qWordStep = [ ( beginWord, 1 ) ]
13
+ guard beginWord. count == endWord. count else {
14
+ return 0
15
+ }
16
+
17
+ var queue = [ ( beginWord, 1 ) ] , wordSet = Set < String > ( wordList)
15
18
16
- while !qWordStep . isEmpty {
17
- let ( currentWord , currentStep ) = qWordStep . removeFirst ( )
19
+ while !queue . isEmpty {
20
+ let ( word , step ) = queue . removeFirst ( )
18
21
19
- if currentWord == endWord {
20
- return currentStep
22
+ if word == endWord {
23
+ return step
21
24
}
22
25
23
- for (i, currentWordChar) in currentWord. enumerated ( ) {
26
+ // transform word
27
+ for i in 0 ..< word. count {
28
+ var wordArray = Array ( word)
29
+
24
30
for char in " abcdefghijklmnopqrstuvwxyz " {
25
- if char != currentWordChar {
26
- let newWord = currentWord. replace ( at: i, to: char)
27
-
28
- if words. contains ( newWord) {
29
- qWordStep. append ( ( newWord, currentStep + 1 ) )
30
-
31
- words. remove ( newWord)
32
- }
31
+ guard char != wordArray [ i] else {
32
+ continue
33
33
}
34
+
35
+ wordArray [ i] = char
36
+ let transformedWord = String ( wordArray)
37
+
38
+ guard wordSet. contains ( transformedWord) else {
39
+ continue
40
+ }
41
+
42
+ wordSet. remove ( transformedWord)
43
+ queue. append ( ( transformedWord, step + 1 ) )
34
44
}
35
45
}
36
46
}
37
47
38
48
return 0
39
49
}
40
50
}
41
-
42
- extension String {
43
- func replace( at index: Int , to char: Character ) -> String {
44
- var chars = Array ( self )
45
-
46
- chars [ index] = char
47
-
48
- return String ( chars)
49
- }
50
- }
0 commit comments