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. 迭代导出word 文档

    Map迭代的使用: Map map = new HashMap() ; Iterator it = map.entrySet().iterator() ; while (it.hasNext()) { ...

  2. (转)pem, cer, p12 and the pains of iOS Push Notifications encryption

    转自:http://cloudfields.net/blog/ios-push-notifications-encryption/ The serious pains of setting up a ...

  3. pptv web前端面试题答案

    这是星期一考完试,答应星期三补上的,代码很简单,就不写注释了 //php快排 function quickSort(&$arr){   $arr_left=new array();   $ar ...

  4. Python函数对象

    秉承着一切皆对象的理念,我们再次回头来看函数(function).函数也是一个对象,具有属性(可以使用dir()查询).作为对象,它还可以赋值给其它对象名,或者作为参数传递. lambda函数 在展开 ...

  5. 【转】MVP和MVC的区别

    转自:http://www.cnblogs.com/end/archive/2011/06/02/2068512.html MVC和MVP到底有什么区别呢? 从这幅图可以看到,我们可以看到在MVC里, ...

  6. 整理:C#写ActiveX, 从代码到打包到签名到发布的示例

    对于不懂C++和VB的我, 在工作上却遇到需要重写旧ActiveX控件的任务. 好在客户机都是Windows PC, 基本上都有.net framework 2.0, 勉强用C#实现可以满足需求 所以 ...

  7. spring项目中监听器作用-ContextLoaderListener(项目启动时,加载一些东西到缓存中)

    作用:在启动Web容器时,自动装配Spring applicationContext.xml的配置信息. 因为它实现了ServletContextListener这个接口,在web.xml配置这个监听 ...

  8. windows身份验证,那么sqlserver的连接字符串的

    Data Source=计算机名称或ip地址;Initial Catalog=数据库名称;Integrated Security=True windows身份验证不需要psw的Provider=SQL ...

  9. 关于eclipse几种插件的安装方法

    首先这里的安装方法按文件类型和安装方式来分 首先介绍按不同安装方式来分: 1.利用eclipse自带插件安装功能: 以jode插件为例,启动eclipse,help -> Software Up ...

  10. Swift--基础(二)元组 断言 错误处理

    元组(tuples) 把多个值组合成一个复合值.元组内的值可以是任意类型,并不要求是相同类型 let http404Error = (404, "Not Found") let ( ...