/
208.实现-trie-前缀树.swift
60 lines (52 loc) · 1.29 KB
/
208.实现-trie-前缀树.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/*
* @lc app=leetcode.cn id=208 lang=swift
*
* [208] 实现 Trie (前缀树)
*/
// @lc code=start
class Trie {
private var root: Trie?
private var isEnd: Bool = false
private var children: [Character: Trie] = [:]
init() {
root = self
isEnd = false
children = [:]
}
func insert(_ word: String) {
var cur = root
for char in word {
if cur?.children[char] == nil {
cur?.children[char] = Trie()
}
cur = cur?.children[char]!
}
cur?.isEnd = true
}
func search(_ word: String) -> Bool {
let node = searchPrefix(word)
return node != nil && node?.isEnd == true
}
func startsWith(_ prefix: String) -> Bool {
let node = searchPrefix(prefix)
return node != nil
}
private func searchPrefix(_ prefix: String) -> Trie? {
var cur = root
for char in prefix {
guard let child = cur?.children[char] else {
return nil
}
cur = child
}
return cur
}
}
/**
* Your Trie object will be instantiated and called as such:
* let obj = Trie()
* obj.insert(word)
* let ret_2: Bool = obj.search(word)
* let ret_3: Bool = obj.startsWith(prefix)
*/
// @lc code=end