问题描述
我很难在 JS 中实现自动完成系统。我在这里看到了其他语言,但我没有看到如何使用 JS 实现 Trie。我的问题不是尝试本身。更多的是关于如何返回trie的公共前缀的单词。基本上都是建议。我觉得我对这最后一步想得太多了,但我觉得我需要以某种方式使用 dfs 来获得暗示性词。我的脑子里没有逻辑。
我的实现:
class Trie {
constructor() {
this.root = {};
this.endOfWord = "*";
}
insert(word) {
let node = this.root;
for (const char of word) {
if (!(char in node)) node[char] = {};
node = node[char];
}
node[this.endOfWord] = word;
}
search(word) {
let node = this.root;
for (const char of word) {
if (!(char in node)) return false;
node = node[char];
}
return this.endOfWord in node;
}
startsWith(prefix) {
let node = this.root;
for (const char of prefix) {
if (!(char in node)) return false;
node = node[char];
}
return true;
}
}
解决方法
您的 startsWith
方法需要返回一个数组。所以当前缀不在树中时,你应该返回一个空数组。
如果你确实找到了前缀,那么从树中的那个节点开始深度优先搜索,并产生你在那里找到的所有结果:
startsWith(prefix) {
let node = this.root;
for (const char of prefix) {
if (!(char in node)) return []; // No results
node = node[char];
}
function * recur(prefix,node) {
for (const char in node) {
if (char == "*") {
yield prefix;
} else {
yield * recur(prefix + char,node[char]);
}
}
}
return Array.from(recur(prefix,node));
}