带有 Trie 的 JavaScript 自动完成

问题描述

我很难在 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));
  }