-
-
Notifications
You must be signed in to change notification settings - Fork 9k
/
Copy pathSolution.cpp
72 lines (64 loc) · 1.71 KB
/
Solution.cpp
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
61
62
63
64
65
66
67
68
69
70
71
72
class Trie {
private:
Trie* children[26];
bool isEnd = false;
public:
Trie() {
fill(begin(children), end(children), nullptr);
}
void insert(const string& w) {
Trie* node = this;
for (char c : w) {
int i = c - 'a';
if (!node->children[i]) {
node->children[i] = new Trie();
}
node = node->children[i];
}
node->isEnd = true;
}
bool search(const string& w) {
function<bool(int, Trie*, int)> dfs = [&](int i, Trie* node, int diff) {
if (i >= w.size()) {
return diff == 1 && node->isEnd;
}
int j = w[i] - 'a';
if (node->children[j] && dfs(i + 1, node->children[j], diff)) {
return true;
}
if (diff == 0) {
for (int k = 0; k < 26; ++k) {
if (k != j && node->children[k]) {
if (dfs(i + 1, node->children[k], 1)) {
return true;
}
}
}
}
return false;
};
return dfs(0, this, 0);
}
};
class MagicDictionary {
public:
MagicDictionary() {
trie = new Trie();
}
void buildDict(vector<string> dictionary) {
for (auto& w : dictionary) {
trie->insert(w);
}
}
bool search(string searchWord) {
return trie->search(searchWord);
}
private:
Trie* trie;
};
/**
* Your MagicDictionary object will be instantiated and called as such:
* MagicDictionary* obj = new MagicDictionary();
* obj->buildDict(dictionary);
* bool param_2 = obj->search(searchWord);
*/