实现一个 Trie,包含 insertsearch, 和 startsWith 这三个方法。

注意事项

你可以假设所有的输入都是小写字母a-z。

您在真实的面试中是否遇到过这个题?

Yes
样例

insert("lintcode")
search("code") // return false
startsWith("lint") // return true
startsWith("linterror") // return false
insert("linterror")
search("lintcode) // return true
startsWith("linterror") // return true

思路:这是一道基本的关于字典树的插入,查询和前缀查询的问题。

          本身题目中,插入和查询的过程都非常相似,所以思路相对也很清晰;             

           首先正确定义TrieNode节点类,定义时用一个标记位来标记字符串是否存在。然后定义一个节点类型的指针数组,大小为26,用来存放可能存在的节点。

            插入前先看前缀是否存在。如果存在,就共享,否则创建对应的节点和边。查询过程类似。

/**
* Your Trie object will be instantiated and called as such:
* Trie trie;
* trie.insert("lintcode");
* trie.search("lint"); will return false
* trie.startsWith("lint"); will return true
*/ /*
思路:这是一道基本的关于字典树的插入,查询和前缀查询的问题。 本身题目中,插入和查询的过程都非常相似,所以思路相对也很清晰; 插入前先看前缀是否存在。如果存在,就共享,否则创建对应的节点和边。
*/ #define MAX_CHILD 26 class TrieNode {
public:
// Initialize your data structure here.
//对于构造函数,需要对对每个节点的指针都进行初始化;
/*
任何指针变量刚被创建时不会自动成为NULL指针,它的值是随机的,它会乱指一气。
所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
*/
int count;
TrieNode* child[MAX_CHILD];
TrieNode() {
for(int i = 0; i < 26; i++)
child[i] = NULL;
count=0; }
}; //在这里,我将每个函数的形参都修改成为了pass-by-reference-const,原因是在effective C++ 中
//建议对于容器使用引用传递可以洁身好多调用拷贝构造函数的时间。 class Trie {
public:
Trie() {
root = new TrieNode();
} // Inserts a word into the trie.
void insert(const string& word) {
if(root==NULL||word.size()==0){
return;
} int len=word.size();
TrieNode* t=root;
int i=0; while(i<len){
//从根节点以下开始查找,看前缀是否存在,如果不存在,则插入节点,如果存在则移动指针;
if(t->child[word[i]-'a']==NULL){
TrieNode* temp=new TrieNode();
t->child[word[i]-'a']=temp;
t=t->child[word[i]-'a'];
}
else{
t=t->child[word[i]-'a'];
}
i++;
}
t->count=1;
} // Returns if the word is in the trie.
//可以看到,查询前缀过程和插入过程十分相似;
bool search(const string& word) {
if(root==NULL||word.size()==0){
return false;
} TrieNode* t=root;
int len=word.size();
int i=0; while(i<len){
if(t->child[word[i]-'a']==NULL){
return false;
}
else{
t=t->child[word[i]-'a'];
}
i++;
} if((i==len)&&(t->count==1)){
return true;
} return false;
} // Returns if there is any word in the trie
// that starts with the given prefix.
bool startsWith(const string& prefix) {
if(root==NULL||prefix.size()==0){
return false;
} int len=prefix.size();
TrieNode* t=root;
int i=0; while(i<len){
if(t->child[prefix[i]-'a']==NULL){
return false;
}
else{
t=t->child[prefix[i]-'a'];
}
i++;
} return true;
} private:
TrieNode* root;
};

Lintcode---实现 Trie的更多相关文章

  1. [LintCode] Implement Trie 实现字典树

    Implement a trie with insert, search, and startsWith methods. Have you met this question in a real i ...

  2. lintcode 中等题: Implement Trie

    题目 Implement Trie Implement a trie with insert, search, and startsWith methods. 样例   注意 You may assu ...

  3. Implement Trie(LintCode)

    Implement Trie Implement a trie with insert, search, and startsWith methods. 样例   注意 You may assume ...

  4. [leetcode/lintcode 题解] 微软 面试题:实现 Trie(前缀树)

    实现一个 Trie,包含 ​insert​, ​search​, 和 ​startsWith​ 这三个方法.   在线评测地址:领扣题库官网     样例 1: 输入:    insert(" ...

  5. [LintCode]——目录

    Yet Another Source Code for LintCode Current Status : 232AC / 289ALL in Language C++, Up to date (20 ...

  6. Implement Trie (Prefix Tree) 解答

    Question Implement a trie with insert, search, and startsWith methods. Note:You may assume that all ...

  7. leetcode & lintcode for bug-free

    刷题备忘录,for bug-free leetcode 396. Rotate Function 题意: Given an array of integers A and let n to be it ...

  8. leetcode & lintcode 题解

    刷题备忘录,for bug-free 招行面试题--求无序数组最长连续序列的长度,这里连续指的是值连续--间隔为1,并不是数值的位置连续 问题: 给出一个未排序的整数数组,找出最长的连续元素序列的长度 ...

  9. lintcode-442-实现 Trie

    442-实现 Trie 实现一个 Trie,包含 insert, search, 和 startsWith 这三个方法. 注意事项 你可以假设所有的输入都是小写字母a-z. 样例 insert(&qu ...

随机推荐

  1. Linux操作系统下的常见系统资源共享

    转:http://www.360doc.com/content/07/0420/10/25127_457022.shtml linux下如何挂接(mount)光盘镜像文件.移动硬盘.U盘.Window ...

  2. [Android Memory] Android系统中查看某个应用当前流量的方法

    转载自: http://blog.sina.com.cn/s/blog_628cc2b70101dbyy.html 一.查看原理:某个应用的网络流量数据保存在系统的/proc/uid_stat/$UI ...

  3. metal &object c

    https://developer.apple.com/documentation/metal/mtlcommandencoder/1458041-pushdebuggroup PushDebugGr ...

  4. subline 配置,本地项目代码下断点来调试远程项目

    参考: https://my.oschina.net/ptk/blog/299464 1. 文件 tts.sublime-project 的配置如下: { "folders": [ ...

  5. (转)IntelliJ IDEA下的使用git

    1.git简介 Git是目前流行的分布式版本管理系统.它拥有两套版本库,本地库和远程库,在不进行合并和删除之类的操作时这两套版本库互不影响.也因此其近乎所有的操作都是本地执行,所以在断网的情况下任然可 ...

  6. [Tools] Unlock TypeScript's Features in Vanilla JS with @ts-check and JSDoc

    TypeScript can help you with your plain JavaScript files if you add a simple //@ts-check comment. Th ...

  7. TestNG参数化测试Spring应用Dubbo接口

    一.配置dubbo的Bean文件: 配置spring-dubbo.xml文件: <dubbo:reference interface="com.datatrees.basisdata. ...

  8. Node.js 2017.11.5-2017.11.16期间制作的图片爬虫总结

    2017年11月18日12:33:06

  9. PHP上传文件代码练习2 (重复文章)

    表单: <html> <head> <meta http-equiv="Content-Type" content="text/html; ...

  10. P2P网络借贷系统-核心功能-用户投标-业务解说

    用户投标是P2P网络借贷系统的核心功能.相对照较复杂,为了更好地梳理业务和技术实现思路,特地具体总结分析下. 输入:用户id-uid.标的id-lid.投标金额-amount 1.依据lid,获得贷款 ...