211. Design Add and Search Words

2021-10-10  本文已影响0人  jluemmmm

添加与搜索单词,数据结构设计。

Trie 称为数字树或前缀树,是一种搜索有序树数据结构,主要用于对字符串进行高效的动态添加/搜索操作。

应用:自动完成搜索、拼写检查、T9预测文本,IP路由(最长前缀匹配)等。

如果用hash实现的情况下,时间复杂度O(m * n)。大型数据集的缩放,一旦哈希表的增加,会有很多哈希冲突,搜索时间复杂度可以增加到 O(n ^ 2 * m),当存储具有许多相同前缀的键时,与hashmap相比,Trie可以使用更少的空间。

参考208,递归实现


var WordDictionary = function() {
  this.map = {};
};

/** 
 * @param {string} word
 * @return {void}
 */
WordDictionary.prototype.addWord = function(word) {
  let node = this.map;
  for (const ch of word) {
    if (!node[ch]) {
      node[ch] = {};
    }
    node = node[ch];
  }
  node.isEnd = true;
  // console.log(this.map)
};

/** 
 * @param {string} word
 * @return {boolean}
 */
WordDictionary.prototype.search = function(word) {
  return this.searchInNode(word, this.map);
};


WordDictionary.prototype.searchInNode = function(word, node) {
  for (let i = 0; i < word.length; i++) {
    const ch = word[i];
    if (!node[ch]) {
      if (ch === '.') {
        for (let j in node) {
          if (this.searchInNode(word.substring(i + 1), node[j])) {
            return true;
          }
        }
      }
      return false;
    } else {
      node = node[ch];
    }
  }
  return node !== undefined && node.isEnd !== undefined;
};

/** 
 * Your WordDictionary object will be instantiated and called as such:
 * var obj = new WordDictionary()
 * obj.addWord(word)
 * var param_2 = obj.search(word)
 */
上一篇下一篇

猜你喜欢

热点阅读