Create 1268-search-suggestions-system.js#2624
Conversation
Solved search-suggestions-system in JS.
| * @param {string} searchWord | ||
| * @return {string[][]} | ||
| */ | ||
| var suggestedProducts = function(products, searchWord) { |
There was a problem hiding this comment.
Suggestion: Break down function to match O() complexity
products.sort(sortAsc); /* Time O(N * log(N) */
search(...); /* Time O(......) */There was a problem hiding this comment.
Suggestion: Look at Trie
/**
* DFS - Trie
* Time O(N * M) | Space O(N)
* https://leetcode.com/problems/search-suggestions-system/
* @param {string[]} products
* @param {string} searchWord
* @return {string[][]}
*/
var suggestedProducts = (products, searchWord) => new Trie()
.buildTrie(products)
.searchWord(searchWord);
class Node {
constructor () {
this.children = new Map();
this.isWord = false;
}
};
class Trie {
constructor () {
this.root = new Node();
}
buildTrie (products) {
for (const word of products) {
this.insert(word);
}
return this;
}
insert (word, { root: node } = this) {
for (const char of word.split('')) {
const child = (node.children.get(char) ?? new Node());
node.children.set(char, child);
node = child;
}
node.isWord = true;
}
searchWord (searchWord, buffer = [], suggestions = []) {
for (const char of searchWord.split('')) {
const prefix = this.getPrefix(buffer, char);
const words = this.getSuggestions(prefix);
suggestions.push(words);
}
return suggestions;
}
getPrefix (buffer, char) {
buffer.push(char);
return buffer.join('');
}
getSuggestions (prefix, words = []) {
const node = this.getPrefixNode(prefix);
const isInvalidPrefix = (node === null);
if (isInvalidPrefix) return words
return this.search(node, prefix, words);
}
getPrefixNode (prefix, { root: node } = this) {
for (const char of prefix.split('')) {
const child = (node.children.get(char) ?? null);
const isLeafNode = (child === null);
if (isLeafNode) return null;
node = child;
}
return node;
}
search (node, word, words) {
const isBaseCase = (words.length === 3);
if (isBaseCase) return words;
if (node.isWord) words.push(word);
return this.dfs(node, word, words);
}
dfs (node, word, words) {
for (const char of this.getChars()) {
const child = (node.children.get(char) ?? null);
const isLeafNode = (child === null);
if (isLeafNode) continue;
this.search(child, (word + char), words);
}
return words;
}
getChars () {
return new Array(26).fill()
.map((_, index) => String.fromCharCode((index + 97)));
}
};There was a problem hiding this comment.
Don't you think it's too much? I mean, I might be intimidating for some people. NeetCode solved it with binary-search that's how I solved it too. It was more concise that way. But, if you want, I can add this solution in addition to the binary-search one.
There was a problem hiding this comment.
Trie is typically a better solution since for searching, suggestions, and prefix against words.
Also the complexity is better.
There was a problem hiding this comment.
Ok, I'll implement that.
There was a problem hiding this comment.
@aakhtar3, I added the trie solution. But I kept the binary-search solution for reference.
Added Trie solution in addition to binary-search.
Solved search-suggestions-system in JS.
File(s) Added: 1268-search-suggestions-system.js
Language(s) Used: JavaScript
Submission URL: https://leetcode.com/problems/search-suggestions-system/submissions/977924742/