forked from chihungyu1116/leetcode-javascript
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path211 Add and Search Word - Data structure design.js
91 lines (75 loc) · 2.19 KB
/
211 Add and Search Word - Data structure design.js
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// Design a data structure that supports the following two operations:
// void addWord(word)
// bool search(word)
// search(word) can search a literal word or a regular expression string containing only letters a-z or .. A . means it can represent any one letter.
// For example:
// addWord("bad")
// addWord("dad")
// addWord("mad")
// search("pad") -> false
// search("bad") -> true
// search(".ad") -> true
// search("b..") -> true
// Note:
// You may assume that all words are consist of lowercase letters a-z.
// click to show hint.
// Hide Company Tags Facebook
// Hide Tags Backtracking Trie Design
// Hide Similar Problems (M) Implement Trie (Prefix Tree)
function TrieNode(chr) {
this.val = chr;
this.isWord = false;
this.children = [];
}
/**
* @constructor
*/
var WordDictionary = function() {
this.root = new TrieNode(null, false);
};
/**
* @param {string} word
* @return {void}
* Adds a word into the data structure.
*/
WordDictionary.prototype.addWord = function(word) {
var node = this.root;
for(var i = 0; i < word.length; i++) {
var chr = word[i];
node.children[chr] = node.children[chr] || new TrieNode(chr);
node = node.children[chr];
}
node.isWord = true;
};
/**
* @param {string} word
* @return {boolean}
* Returns if the word is in the data structure. A word could
* contain the dot character '.' to represent any one letter.
*/
WordDictionary.prototype.search = function(word) {
var node = this.root;
function dfs(node, word, i) {
if(i === word.length) {
return node.isWord;
}
var chr = word[i];
if(chr === '.') {
for(var key in node.children) {
if(dfs(node.children[key], word, i + 1)) {
return true;
}
}
} else if(node.children[chr]) {
return dfs(node.children[chr], word, i + 1);
}
return false;
}
return dfs(node, word, 0);
};
/**
* Your WordDictionary object will be instantiated and called as such:
* var wordDictionary = new WordDictionary();
* wordDictionary.addWord("word");
* wordDictionary.search("pattern");
*/