Implement Trie (Prefix Tree)

来源:互联网 发布:sql一次insert多行 编辑:程序博客网 时间:2024/04/28 12:13

Implement a trie with insert, search, and startsWith methods.

trie树,又叫字典树,单词查找树。

它有三个特性:根节点不包含字符,除根节点外每一个节点都只包含一个字符; 

从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串; 

每个节点的所有子节点包含的字符都不相同。

一个trie node应该包括它的character,它的children和是否是叶结点。


所以先定义TrieNode:

class TrieNode {    // Initialize your data structure here.    char c;    HashMap<Character, TrieNode> children = new HashMap<Character, TrieNode>();    boolean isLeaf;    public TrieNode(char c){        this.c = c;    }    public TrieNode() { }}

然后是Trie类,可以实现插入,查找单词(isLeaf=true),查找前缀的操作。

public class Trie {    private TrieNode root;    public Trie() {        root = new TrieNode();    }    // Inserts a word into the trie.    public void insert(String word) {        HashMap<Character,TrieNode> children=root.children;        for(int i=0;i<word.length();i++){            char c=word.charAt(i);            TrieNode t;            if(children.containsKey(c)){                t=children.get(c);            }else{                t=new TrieNode(c);                children.put(c,t);            }            children=t.children;            if(i==word.length()-1)                t.isLeaf=true;        }    }    // Returns if the word is in the trie.    public boolean search(String word) {        TrieNode t=findNode(word);        if(t!=null&&t.isLeaf)            return true;        else            return false;    }    // Returns if there is any word in the trie    // that starts with the given prefix.    public boolean startsWith(String prefix) {        if(findNode(prefix)==null)            return false;        else            return true;    }    private TrieNode findNode(String s){       HashMap<Character,TrieNode> children=root.children;       TrieNode t=null;       for(int i=0;i<s.length();i++){           char c=s.charAt(i);           if(children.containsKey(c)){               t=children.get(c);               children=t.children;           }else            return null;       }       return t;    }}// Your Trie object will be instantiated and called as such:// Trie trie = new Trie();// trie.insert("somestring");// trie.search("key");



0 0
原创粉丝点击