(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 ...
随机推荐
- java中protect属性用法总结
测试代码: pojo类: package com.lky.h1; public class Base { private Integer id; protected String name; publ ...
- (转)Linux下apache限速和限制同一IP连接数的实现
单位有一台DELL的服务器,4核双CPU,4G内存,1TB的存储空间,闲来无事,申请了域名http://www.zxzy123.cn,做了个网站,本以为用这样的配置做个下载站是绰绰有余了,没想到上线没 ...
- java Date获取 年月日时分秒
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...
- android避免decodeResource图片时占用太大的内存
增加largeHeap="true"属性. android:largeHeap Whether your application's processes should be cre ...
- PHP页面之间跳转方法总结
编程中,在页面之间进行跳转是必须的.这里列出了三种办法,供参考. 一.用HTTP头信息 也就是用PHP的HEADER函数.PHP里的HEADER函数的作用就是向浏览器发出由HTTP协议规定的本来应该通 ...
- mysql主从监控
要求:检测myslq从库状态,跳过固定的错误号,每隔30秒检测一次,如果符合条件自动跳过或者是重启从库 1)取出mysql从库的关键字 [root@localhost scripts]# mysql ...
- ZCTF-Restaurant-Pwn500
版权声明:本文为博主原创文章,未经博主允许不得转载. 这道压轴的题也是名副其实,很有分量.这也是自己第二次做C++类型的PWN.含有两个漏洞,缺一不可,一个漏洞将指定位置覆盖为对象虚表的地址,另外一个 ...
- 常用元素的属性/方法 attr / val / html /text
常用元素的属性/方法 得到一个元素的高度, $("#myid").height() 得到一个元素的位置, $("#myid").offset() 返回的是一个o ...
- 自定义ViewGroup 流式布局
使用 public class MainActivity extends Activity { @Override protected void onCreate(Bundle sav ...
- EF中使用SqlQuery进行参数化查询时抛出异常
EF中使用带参数的SqlQuery进行查询时,抛出"另一个 sqlparametercollection 中已包含 sqlparameter"异常. 这是由于SqlParamert ...