Skip to content

Commit f486f65

Browse files
committed
[DFS] Update a solution to Word Search II
1 parent ea77b6b commit f486f65

File tree

1 file changed

+43
-36
lines changed

1 file changed

+43
-36
lines changed

DFS/WordSearchII.swift

Lines changed: 43 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,26 @@
99
*/
1010

1111
class WordSearchII {
12-
func findWords(board: [[Character]], _ words: [String]) -> [String] {
12+
13+
func findWords(_ board: [[Character]], _ words: [String]) -> [String] {
1314
var res = [String]()
1415

1516
let m = board.count
1617
let n = board[0].count
1718

1819
let trie = _convertToTrie(words)
19-
var visited = [[Bool]](count: m, repeatedValue: Array(count: n, repeatedValue: false))
20+
var visited = [[Bool]](repeating: Array(repeating: false, count: n), count: m)
2021

21-
for i in 0..<m {
22-
for j in 0..<n {
22+
for i in 0 ..< m {
23+
for j in 0 ..< n {
2324
_dfs(board, m, n, i, j, &visited, &res, trie, "")
2425
}
2526
}
2627

2728
return res
2829
}
2930

30-
private func _dfs(board: [[Character]], _ m: Int, _ n: Int, _ i: Int, _ j: Int, inout _ visited: [[Bool]], inout _ res: [String], _ trie: Trie, _ str: String) {
31+
fileprivate func _dfs(_ board: [[Character]], _ m: Int, _ n: Int, _ i: Int, _ j: Int, _ visited: inout [[Bool]], _ res: inout [String], _ trie: Trie, _ str: String) {
3132
// beyond matrix
3233
guard i >= 0 && i < m && j >= 0 && j < n else {
3334
return
@@ -58,7 +59,7 @@ class WordSearchII {
5859
visited[i][j] = false
5960
}
6061

61-
func _convertToTrie(words: [String]) -> Trie {
62+
func _convertToTrie(_ words: [String]) -> Trie {
6263
let trie = Trie()
6364

6465
for str in words {
@@ -70,65 +71,71 @@ class WordSearchII {
7071
}
7172

7273

73-
class TrieNode {
74-
var isEnd: Bool
75-
var letter: Character
76-
var children: [Character: TrieNode]
77-
78-
init(_ letter: Character) {
79-
self.isEnd = false
80-
self.letter = letter
81-
self.children = [Character: TrieNode]()
82-
}
83-
}
84-
85-
8674
class Trie {
87-
var root: TrieNode?
75+
var root: TrieNode
8876

8977
init() {
90-
root = TrieNode(Character("0"))
78+
root = TrieNode()
9179
}
9280

9381
func insert(_ word: String) {
9482
var node = root
83+
var word = [Character](word.characters)
9584

96-
for char in word {
97-
if node?.children[char] == nil {
98-
node?.children[char] = TrieNode(char)
85+
for i in 0 ..< word.count {
86+
let c = word[i]
87+
88+
if node.children[c] == nil {
89+
node.children[c] = TrieNode()
9990
}
10091

101-
node = node?.children[char]
92+
node = node.children[c]!
10293
}
10394

104-
node?.isEnd = true
95+
node.isEnd = true
10596
}
10697

107-
func search(_ word: String) -> Bool {
98+
func isWord(_ word: String) -> Bool {
10899
var node = root
100+
var word = [Character](word.characters)
109101

110-
for char in word {
111-
guard let childTrieNode = node?.children[char] else {
102+
for i in 0 ..< word.count {
103+
let c = word[i]
104+
105+
if node.children[c] == nil {
112106
return false
113107
}
114108

115-
node = childTrieNode
109+
node = node.children[c]!
116110
}
117111

118-
return node?.isEnd
112+
return node.isEnd
119113
}
120-
121-
func start(with word: String) -> Bool {
114+
115+
func isWordPrefix(_ prefix: String) -> Bool {
122116
var node = root
117+
var prefix = [Character](prefix.characters)
123118

124-
for char in word {
125-
guard let childTrieNode = node?.children[char] else {
119+
for i in 0 ..< prefix.count {
120+
let c = prefix[i]
121+
122+
if node.children[c] == nil {
126123
return false
127124
}
128125

129-
node = childTrieNode
126+
node = node.children[c]!
130127
}
131128

132129
return true
133130
}
134131
}
132+
133+
class TrieNode {
134+
var isEnd: Bool
135+
var children: [Character:TrieNode]
136+
137+
init() {
138+
isEnd = false
139+
children = [Character:TrieNode]()
140+
}
141+
}

0 commit comments

Comments
 (0)