前缀树

104 阅读1分钟

记录一下,可用于自动补全..

class TrieNode{
    private TrieNode[] nodes; //保存下一个Trie节点
    private boolean isWord; //记录这个序列是否是一个单词
    public TrieNode(){
    	nodes = new TrieNode[26]; //一共26个字母,0-25对应a-z
    }
    public TrieNode get(char ch){
    	return nodes[ch - 'a'];
    }
    public void put(char ch,TrieNode node){
    	nodes[ch - 'a'] = node;
    }
    public boolean containKey(char ch){
    	return nodes[ch - 'a'] != null;
    }
    public void setIsWord(){
    	isWord = true;
    }
    public boolean isWord(){
    	return isWord;
    }
}
class Trie {
    private TrieNode root;
    public Trie() {
        root = new TrieNode();
    }
    //将一个单词插入root中,建立前缀树
    public void insert(String word) { 
        TrieNode node = root;
        for (int i = 0; i < word.length(); i++) {
            char ch = word.charAt(i);
            if (!node.containKey(ch)) {
                node.put(ch, new TrieNode());
            }
            node = node.get(ch);
        }
        node.setIsWord();
    }
    //搜索有没有这个单词
    public boolean search(String word) {
        TrieNode node = root;
        for (int i = 0; i < word.length() && node != null; i++) {
            char ch = word.charAt(i);
            if (!node.containKey(ch)) {
                node.get(ch);
            }
            node = node.get(ch);
        }
        return node != null ? node.isWord() : false;
    }
    //搜索是否有这个前缀的单词
    public boolean startsWith(String prefix) {
        TrieNode node = root;
        for (int i = 0; i < prefix.length() && node != null; i++) {
            char ch = prefix.charAt(i);
            if (!node.containKey(ch)) {
                node.get(ch);
            }
            node = node.get(ch);
        }
        return node != null;
    }
}