Implement an autocomplete system. That is, given a query string s and a set of all possible query strings, return all strings in the set that have s as a prefix.

For example, given the query string de and the set of strings [dogdeerdeal], return [deerdeal].

Hint: Try preprocessing the dictionary into a more efficient data structure to speed up queries.

It is using the Trie data stucture, check thist post;

The only changes is that when we search for words, it is partially matched + whole word match.

Which means if we search 'de', it should return [deer, deal],

if we search 'deer', it should return [deer],

if we search 'deerr', it should return [].

function Node () {
return {
keys: new Map(),
isEnd: false
}
} function Trie () {
return {
root: new Node(),
// Add words into the tree
// Recursive
add(word, node = this.root) {
// If there is no word, means it reach the end
if (word.length === ) {
node.isEnd = true;
return;
} const [head, ...rest] = word;
// If char is not set, then create a new Node to hold char
// Otherwise, continue
if (!node.keys.has(head)) {
node.keys.set(head, new Node(head));
}
// Continue with three
this.add(rest, node.keys.get(head));
},
// Print all the words in the tree
print () {
let words = [];
// Helper function, Recursive
function search (node = this.root, string = '') {
// Make sure we have keys
if (node.keys.size !== ) {
for (let key of node.keys.keys()) {
// update node, update string
search(node.keys.get(key), string.concat(key));
}
// if reach the end, push to the words
if (node.isEnd) {
words.push(string);
}
} else {
// If there is no keys, then push the avaialbe string to the words
string.length > ? words.push(string) : null;
}
} search(this.root, '');
return words.length > ? words : null;
},
// Find the words based on input
find (input) {
let words = []; function search(node = this.root, string = '', input) { if (node.keys.size !== ) {
for (let key of node.keys.keys()) {
// if the key is the same as input[0]
// becasue we want the whole word, so continue with current trees
if (key === input[] || input.length === ) {
let rest = input.length === ? '': input.substr();
search(node.keys.get(key), string.concat(key), rest);
}
}
} else {
// In case of input is 'cattt', then return undefined
if (input.length !== ) {
return [];
}
string.length > ? words.push(string) : [];
}
} search(this.root, '', input); return words.length > ? words : [];
}
}
} function searchWords () {
const data = ['dog', 'dollar', 'cat', 'drag'];
const trie = new Trie(); data.forEach(d => trie.add(d));
console.log(trie.find('do')); // [ 'dog', 'dollar' ]
console.log(trie.print()); // [ 'dog', 'dollar', 'drag', 'cat' ]
} searchWords();

[Algorithm] Search for matching words的更多相关文章

  1. [Algorithm] Search element in a circular sorted array

    function findInCircularlySortedAry (ary = [], target) { ) { ; } ) { ] === target ? : -; } let , high ...

  2. Deep Dive into Neo4j 3.5 Full Text Search

    In this blog we will go over the Full Text Search capabilities available in the latest major release ...

  3. 广告召回 Query-Ad Matching

    小结: 1.最为基础的召回链路就是要保证召回层的相关性,但是相关性高的广告并不一定具有很高的商业价值,所以开始尝试将一些商业化业务指标作为召回的依据 百度凤巢新一代广告召回系统--"莫比乌斯 ...

  4. (转)Awesome Courses

    Awesome Courses  Introduction There is a lot of hidden treasure lying within university pages scatte ...

  5. w3 parse a url

     最新链接:https://www.w3.org/TR/html53/ 2.6 URLs — HTML5 li, dd li { margin: 1em 0; } dt, dfn { font-wei ...

  6. Computer Vision_18_Image Stitching: Image Alignment and Stitching A Tutorial——2006(book)

    此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面.对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多的文献.有一些刚刚出版的 ...

  7. bash5.0参考手册

    Bash Reference Manual a.summary-letter { text-decoration: none } blockquote.indentedblock { margin-r ...

  8. 算法编程Algos Programming

    算法编程Algos Programming 不同算法的集合,用于编程比赛,如ACM ICPC. 算法按主题划分.大多数算法都可以从文件中按原样运行.每种算法都有一个参考问题,并对其时间和空间复杂度作了 ...

  9. 从头到尾彻底理解KMP

    从头到尾彻底理解KMP 作者:July 时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文,随后的半个多月不断反复改进. 1. 引言 本KMP原文最初写于2年多前的201 ...

随机推荐

  1. QT学习笔记7:C++函数默认参数

    C++中允许为函数提供默认参数,又名缺省参数. 使用默认参数时的注意事项: ① 有函数声明(原型)时,默认参数可以放在函数声明或者定义中,但只能放在二者之一.建议放在函数声明中. double sqr ...

  2. bzoj 3671 贪心

    想到了从小到大依次填,但想到可能有重复元素,那是就会有分支,就不知怎样办了,最后才发现它是用随机数来调整排列,所以没有重复元素,唉..... /**************************** ...

  3. OpenGL 模型视图投影矩阵 仿射矩阵

    矩阵基础知识 要对矩阵进行运算,必须先要了解矩阵的计算公式,这个知识的内容涉及到了线性代数. 我们知道在Cocos2dx中,有关于平移,旋转,缩放等等操作,都必须要进行矩阵的乘法. 只需要一张图就能理 ...

  4. Git_创建版本库

    什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可以追踪历史,或 ...

  5. angularjs中如何在异步请求执行完以后再执行其他函数?

    angularjs中如何在异步请求执行完以后再执行其他函数? 之前脑袋回路就是从上到下的执行js,直到有一次我的页面上已经显示了空才走到angularjs里的$http的成功回调函数里,然后才开始正视 ...

  6. java并发基础(二)

    <java并发编程实战>终于读完4-7章了,感触很深,但是有些东西还没有吃透,先把已经理解的整理一下.java并发基础(一)是对前3章的总结.这里总结一下第4.5章的东西. 一.java监 ...

  7. 从零开始搭建linux下laravel 5.5所需环境(二)

    我们已经装好了nginx,现在我们开始装mysql和php 我们同样使用yum来安装. 先安装MySQL软件(客户端.服务器端.依赖库) yum install -y mysql mysql-serv ...

  8. x-superobject

    x-superobject GITHUB: https://github.com/onryldz/x-superobject **Delphi Cross Platform Rapid JSON**- ...

  9. 5. python 文本解析

    5. python 文本解析 这一章节我们简单的聊聊文本解析的两种方法: 1.分片,通过分片,记录偏移处,然后提取想要的字符串 例子: >>> line='aaa bbb ccc'  ...

  10. 【docker】centOS7上部署的mysql和spring boot服务,要求,mysql的时间、java程序服务的时间和宿主机的时间完全保持一致【修改mysql时区,临时和永久】【修改spring boot配置文件时区】【修改docker启动spring boot实例程序时区】

    要求:centOS7上部署的mysql和spring boot服务,要求,mysql的时间.java程序服务的时间和宿主机的时间完全保持一致: ============================ ...