Lintcode---实现 Trie
实现一个 Trie,包含 insert, search, 和 startsWith 这三个方法。
注意事项
你可以假设所有的输入都是小写字母a-z。
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的更多相关文章
- [LintCode] Implement Trie 实现字典树
Implement a trie with insert, search, and startsWith methods. Have you met this question in a real i ...
- lintcode 中等题: Implement Trie
题目 Implement Trie Implement a trie with insert, search, and startsWith methods. 样例 注意 You may assu ...
- Implement Trie(LintCode)
Implement Trie Implement a trie with insert, search, and startsWith methods. 样例 注意 You may assume ...
- [leetcode/lintcode 题解] 微软 面试题:实现 Trie(前缀树)
实现一个 Trie,包含 insert, search, 和 startsWith 这三个方法. 在线评测地址:领扣题库官网 样例 1: 输入: insert(" ...
- [LintCode]——目录
Yet Another Source Code for LintCode Current Status : 232AC / 289ALL in Language C++, Up to date (20 ...
- Implement Trie (Prefix Tree) 解答
Question Implement a trie with insert, search, and startsWith methods. Note:You may assume that all ...
- leetcode & lintcode for bug-free
刷题备忘录,for bug-free leetcode 396. Rotate Function 题意: Given an array of integers A and let n to be it ...
- leetcode & lintcode 题解
刷题备忘录,for bug-free 招行面试题--求无序数组最长连续序列的长度,这里连续指的是值连续--间隔为1,并不是数值的位置连续 问题: 给出一个未排序的整数数组,找出最长的连续元素序列的长度 ...
- lintcode-442-实现 Trie
442-实现 Trie 实现一个 Trie,包含 insert, search, 和 startsWith 这三个方法. 注意事项 你可以假设所有的输入都是小写字母a-z. 样例 insert(&qu ...
随机推荐
- canvas之arcTo
arc与arcTo,从名字都能看出来相似.arcTo也是画曲线的方法,而且他画出的曲线也是正圆的一段弧线.但他的参数和arc简直是不共戴天~ ctx.arcTo(x1,y1,x2,y2,radius) ...
- (Mark)JS中的上下文
执行上下文的代码被分成两个基本的阶段来处理: 进入执行上下文 执行代码 变量对象的修改变化与这两个阶段紧密相关. 注:这2个阶段的处理是一般行为,和上下文的类型无关(也就是说,在全局上下文和函数上下文 ...
- 激活Debian 7 的桌面(把图标放在桌面上)
转:http://www.acyoo.com/archives/3017.html Debian 7的默认桌面是Gnome 3, 刚装好时无法在桌面进行任何操作,不过只需要设置一下就可以了: 左上角 ...
- hive如何使用中文查询条件
直接在hql中使用中文会报错:org.apache.hadoop.ipc.RemoteException: java.io.IOException: java.lang.RuntimeExceptio ...
- ISP图像调试工程师——tone Mapping(ISP)
http://www.cnblogs.com/bigbigtree/p/3458797.html
- UVa 164 - String Computer
题目:编辑距离.给你两个串,将已知串转化成目标串,能够增.删.改字母,求最小操作次数. 分析:dp,编辑距离.同最大公共子序列. 注意操作位置是实时变化的. (前面都已经处理好了) ...
- Spark Streaming no receivers彻底思考
数据接入Spark Streaming的二种方式:Receiver和no receivers方式 建议企业级采用no receivers方式开发Spark Streaming应用程序,好处: 1.更优 ...
- WPF使用ARCGIS App文件配置Cs后台文件
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何实现开平方的Pow函数
使用函数EXPT即可(输入的两个参数都可以是LREAL类型),注意跟计算器对比是Xy,所以4的0.123次方结果是1.18 4的0.5次方是2 更多教学视频和资料下载,欢迎关注以下信息 ...
- [莫队算法 线段树 斐波那契 暴力] Codeforces 633H Fibonacci-ish II
题目大意:给出一个长度为n的数列a. 对于一个询问lj和rj.将a[lj]到a[rj]从小到大排序后并去重.设得到的新数列为b,长度为k,求F1*b1+F2*b2+F3*b3+...+Fk*bk.当中 ...