Implement Trie (Prefix Tree)

Implement a trie with insertsearch, and startsWith methods.

Note:
You may assume that all inputs are consist of lowercase letters a-z

solution:

class TrieNode {
// Initialize your data structure here.
boolean isEnd; //是否有单词以该字母结尾
TrieNode[] sons; //子节点[a-z]
char value; //保存该节点代表的字母值 public TrieNode() {
isEnd = false;
sons = new TrieNode[26];
}
} public class Trie {
private TrieNode root; public Trie() {
root = new TrieNode();
} // Inserts a word into the trie.
/**
* 对于传入的单词,从左往右遍历每个字母,依次从根节点向下建树
* 每个节点保存一个字母
* @param word
*/
public void insert(String word) {
if (word == null || word.length() == 0)
return;
TrieNode p = root; //工作指针,初始指向根节点
for (int i = 0; i < word.length(); i++) {
int pos = word.charAt(i) - 'a'; //hash-计算该字母对应的位置
if (p.sons[pos] == null) { //判断该位置是否为空
p.sons[pos] = new TrieNode();
p.sons[pos].value = word.charAt(i);
}
p = p.sons[pos]; //指向子节点
}
p.isEnd = true; //标记该节点,表示有单词以之结尾
} // Returns if the word is in the trie.
/**
* 类似建树过程,从左往右简历单词的每个字母,如果对应位置为空,则表示树中
* 不存在该单词
* @param word
* @return
*/
public boolean search(String word) {
if (word == null || word.length() == 0)
return false;
TrieNode p = root;
for (int i = 0; i < word.length(); i++) {
int pos = word.charAt(i) - 'a';
if (p.sons[pos] == null)
return false;
p = p.sons[pos];
}
return p.isEnd; //false表示所查单词是树中某个单词的前缀,但不完全匹配
} // Returns if there is any word in the trie
// that starts with the given prefix.
public boolean startsWith(String prefix) {
if (prefix == null || prefix.length() == 0)
return false;
TrieNode p = root;
for (int i = 0; i < prefix.length(); i++) {
int pos = prefix.charAt(i) - 'a';
if (p.sons[pos] == null)
return false;
p = p.sons[pos];
}
return true;
}
} // Your Trie object will be instantiated and called as such:
// Trie trie = new Trie();
// trie.insert("somestring");
// trie.search("key");

Add and Search Word

Design a data structure that supports the following two operations:

void addWord(word)
bool search(word)

search(word) can search a literal word or a regular expression string containing only letters a-z or .. A . means it can represent any one letter.

For example:

addWord("bad")
addWord("dad")
addWord("mad")
search("pad") -> false
search("bad") -> true
search(".ad") -> true
search("b..") -> true

Note:
You may assume that all words are consist of lowercase letters a-z.

solution:

public class WordDictionary {

    private Tode root;

    public WordDictionary() {
root = new Tode();
} // Adds a word into the data structure.
/**
* 与上题一致
* @param word
*/
public void addWord(String word) {
if(word == null || word.length() == 0)
return ;
Tode p = root;
for(int i=0; i<word.length(); i++){
int pos = word.charAt(i) - 'a';
if(p.sons[pos] == null){
p.sons[pos] = new Tode();
p.sons[pos].value = word.charAt(i);
}
p = p.sons[pos];
}
p.isEnd = true;
} // Returns if the word is in the data structure. A word could
// contain the dot character '.' to represent any one letter.
/**
* 因为.能匹配所有字母,导致不能直接hash判断字母是否存在,而必须对树进行深度优先遍历。
* @param word
* @return
*/
public boolean search(String word) {
if(word == null || word.length() == 0)
return false;
char[] arr = word.toCharArray();
int index = 0;
Tode p = root;
return goSearch(arr, index, p);
} private boolean goSearch(char[] arr, int index, Tode p) {
if(index == arr.length)
return p.isEnd;
if(arr[index] == '.'){
for(Tode n : p.sons){ //搜索当前节点的所有非空子节点
if(n != null && goSearch(arr, index+1, n)) //若有节点搜索到匹配单词,则直接返回
return true;
}
return false;
}else{
int pos = arr[index] - 'a';
if(p.sons[pos] != null)
return goSearch(arr, index+1, p.sons[pos]);
else
return false;
}
} class Tode{
boolean isEnd;
Tode[] sons;
char value;
public Tode(){
isEnd = false;
sons = new Tode[26];
}
}
} // Your WordDictionary object will be instantiated and called as such:
// WordDictionary wordDictionary = new WordDictionary();
// wordDictionary.addWord("word");
// wordDictionary.search("pattern");

(Data structure)Implement Trie && Add and Search Word的更多相关文章

  1. 字典树(查找树) leetcode 208. Implement Trie (Prefix Tree) 、211. Add and Search Word - Data structure design

    字典树(查找树) 26个分支作用:检测字符串是否在这个字典里面插入.查找 字典树与哈希表的对比:时间复杂度:以字符来看:O(N).O(N) 以字符串来看:O(1).O(1)空间复杂度:字典树远远小于哈 ...

  2. LeetCode208 Implement Trie (Prefix Tree). LeetCode211 Add and Search Word - Data structure design

    字典树(Trie树相关) 208. Implement Trie (Prefix Tree) Implement a trie with insert, search, and startsWith  ...

  3. 【LeetCode】211. Add and Search Word - Data structure design

    Add and Search Word - Data structure design Design a data structure that supports the following two ...

  4. leetcode面试准备:Add and Search Word - Data structure design

    leetcode面试准备:Add and Search Word - Data structure design 1 题目 Design a data structure that supports ...

  5. 【刷题-LeetCode】211. Add and Search Word - Data structure design

    Add and Search Word - Data structure design Design a data structure that supports the following two ...

  6. [LintCode] Add and Search Word 添加和查找单词

    Design a data structure that supports the following two operations: addWord(word) and search(word) s ...

  7. leetcode 211. Add and Search Word - Data structure design Trie树

    题目链接 写一个数据结构, 支持两种操作. 加入一个字符串, 查找一个字符串是否存在.查找的时候, '.'可以代表任意一个字符. 显然是Trie树, 添加就是正常的添加, 查找的时候只要dfs查找就可 ...

  8. [leetcode trie]211. Add and Search Word - Data structure design

    Design a data structure that supports the following two operations: void addWord(word) bool search(w ...

  9. (*medium)LeetCode 211.Add and Search Word - Data structure design

    Design a data structure that supports the following two operations: void addWord(word) bool search(w ...

随机推荐

  1. windows下定时利用bat脚本实现ftp上传和下载

    前言: 工作中可能会遇到以下情况,利用windows作为中转,来实现两台linux服务器的文件传输. 实现步骤: 1.FTP上传和下载的bat脚本. 脚本分为两部分:可执行bat脚本和ftp命令文件: ...

  2. (转)利用ant在Mac 下自动化打包签名Android程序

    1.创建一个android项目 参数说明:-k /--package 为命名空间(包名)-a /--name 工程名-p /--path 项目 -t 为目标平台的版本编号 命令:./android c ...

  3. [React] React Router: activeStyle & activeClassName

    react-router provides two props for setting a specific style on a Link component whose path matches ...

  4. MVC实现类似QQ的网页聊天功能-ajax(下)

    此篇文章主要是对MVC实现类似QQ的网页聊天功能(上)的部分代码的解释. 首先说一下显示框的滚动条置底的问题: 结构很简单一个大的div(高度一定.overflow:auto)包含着两个小的div第一 ...

  5. Python顺序与range和random

    range([start,] stop[, step]) start是开始,stop是停下,step是步长. >>> range(10) range(0, 10) >>& ...

  6. <a>标签中href="javascript:;"

    javascript: 是一个伪协议,其他的伪协议还有 mail:  tel:  file:  等等. 1 <a id="jsPswEdit" class="set ...

  7. DataGrid( 数据表格) 组件[9]

    本节课重点了解 EasyUI 中 DataGrid(数据表格)组件的使用方法,这个组件依赖于Panel(面板).Resizeable(调整大小).LinkButton(按钮).Pageination( ...

  8. oracle 优化 —— 分区表

    一.分区表简介 分区表类型:[范围分区].[列表分区] [hash分区]    [这些分区的组合分区] 范围分区:以某一个范围进行分区.eg:时间段划分. 列表分区:以某一些几个值进行分区.eg:地区 ...

  9. effective条款15,在资源管理类中小心copying行为

    class A { private: int *p; void lock(){ cout << p << "is lock" << endl; ...

  10. XP 安装

    提供一下裝系統的詳細步驟,盡量詳細到每一步都有,希望能對樓主有所幫助,不盡之處還請樓主不吝指出!謝謝 装XP的步骤如下: 开机时,按del键, 进入bios界面,一般选左侧第二项,(Advanced ...