-
Notifications
You must be signed in to change notification settings - Fork 154
/
longest-word-in-dictionary.js
96 lines (83 loc) · 2.07 KB
/
longest-word-in-dictionary.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
92
93
94
95
96
/**
* Given a list of strings words representing an English Dictionary, find the longest word in words
* that can be built one character at a time by other words in words. If there is more than one
* possible answer, return the longest word with the smallest lexicographical order.
*
* If there is no answer, return the empty string.
*
* Example 1:
*
* Input:
* words = ["w","wo","wor","worl", "world"]
*
* Output: "world"
*
* Explanation:
* The word "world" can be built one character at a time by "w", "wo", "wor", and "worl".
*
* Example 2:
*
* Input:
* words = ["a", "banana", "app", "appl", "ap", "apply", "apple"]
*
* Output: "apple"
*
* Explanation:
* Both "apply" and "apple" can be built from other words in the dictionary. However, "apple" is
* lexicographically smaller than "apply".
*
* Note:
*
* - All the strings in the input will only contain lowercase letters.
* - The length of words will be in the range [1, 1000].
* - The length of words[i] will be in the range [1, 30].
*/
class TrieNode {
constructor() {
this.children = {};
this.word = null;
}
}
class Trie {
constructor(words) {
this.root = new TrieNode();
words.forEach(word => {
this.addWord(word);
});
}
addWord(word) {
let current = this.root;
for (let i = 0; i < word.length; i++) {
const c = word[i];
if (!current.children[c]) {
current.children[c] = new TrieNode();
}
current = current.children[c];
}
current.word = word;
}
}
const filter = node => {
return Object.keys(node.children)
.filter(c => !!node.children[c].word)
.map(c => node.children[c])
.sort((a, b) => b.word.localeCompare(a.word));
};
/**
* @param {string[]} words
* @return {string}
*/
const longestWord = words => {
const trie = new Trie(words);
let result = null;
// Perform BFS
let queue = filter(trie.root);
while (queue.length > 0) {
const node = queue.shift();
const next = filter(node);
result = node.word;
queue = queue.concat(next);
}
return result;
};
export default longestWord;