(Data structure)Implement Trie && Add and Search Word
Implement Trie (Prefix Tree)
Implement a trie with insert
, search
, 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的更多相关文章
- 字典树(查找树) leetcode 208. Implement Trie (Prefix Tree) 、211. Add and Search Word - Data structure design
字典树(查找树) 26个分支作用:检测字符串是否在这个字典里面插入.查找 字典树与哈希表的对比:时间复杂度:以字符来看:O(N).O(N) 以字符串来看:O(1).O(1)空间复杂度:字典树远远小于哈 ...
- 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 ...
- 【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 ...
- leetcode面试准备:Add and Search Word - Data structure design
leetcode面试准备:Add and Search Word - Data structure design 1 题目 Design a data structure that supports ...
- 【刷题-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 ...
- [LintCode] Add and Search Word 添加和查找单词
Design a data structure that supports the following two operations: addWord(word) and search(word) s ...
- leetcode 211. Add and Search Word - Data structure design Trie树
题目链接 写一个数据结构, 支持两种操作. 加入一个字符串, 查找一个字符串是否存在.查找的时候, '.'可以代表任意一个字符. 显然是Trie树, 添加就是正常的添加, 查找的时候只要dfs查找就可 ...
- [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 ...
- (*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 ...
随机推荐
- Mac OS X Shell 脚本和终端命令
系统 重启 Mac OS X: 1 shutdown - r now 关闭 Mac OS X: 1 shutdown now 电源管理/省电 获取当前电源管理设置的信息 1 pmset -g 设置显示 ...
- INSERT command denied to user
问题分析: 网站运行突然出现下面的 MySQL 错误: 645297 [http-88-13] ERROR com.mes.cart.dao.impl.CartDAOImpl - CartDAOImp ...
- [置顶] NO.4 使用预处理器进行调试
<c++ primer>第四版 p190 ************************************************************************* ...
- Android经常使用的五种弹出对话框
一个Android开发中经常使用对话框的小样例,共同拥有五种对话框:普通弹出对话框,单选对话框,多选对话框,输入对话框及进度条样式对话框: <LinearLayout xmlns:android ...
- 左右TextView旋转门问题
最近由于旋转门问题的一个客户找我,当在字符25更多的时候是不是走了,后来,我在重现的问题,发现问题如下面: 问题1.人物25几个月之内可以去. 问题2.在人物25个月,虽然比屏幕宽度,不去 问题3.屏 ...
- mysql 数据库 备份 还原
参考资料: http://blog.51yip.com/mysql/139.html
- saltstack对递归依赖条件(死循环依赖)的处理
本文将对saltstack中状态文件中require条件产生死循环的情形进行简单的测试和分析 测试思路: 写一个包含递归依赖条件的状态文件,进行测试: A依赖于B B依赖于C ...
- Intent 数据传递 总结
系统API 可以传递的数据类型 1.传递8大基本类型+String+CharSequence及其数组类型 2.传递ArrayList集合 public Intent putIntegerArr ...
- HTML5框架、背景和实体、XHTML的使用规范
HTML5框架 cols :竖排 rows:横排,frameset frame已弃用 iframe仍保留使用.用法: Target属性: HTML5实体 XHTML的使用规范
- IFeatureClass.Search中的 Recycling 参数 - 浅谈.
语法: public IFeatureCursor Search ( IQueryFilter filter, bool Recycling); 当 Recycling 为true时,调用NextFe ...