442 - 实现Trie

2017.9.4

这个学期重新开始刷题啊,一定要坚持下去啊。

首先知道什么是Trie,是一种新的树形结构,通常用来存储字符串。

在TrieNode这个节点中,exist这个变量用来判断是不是字符串的结尾,以此来判断是存在这个字符串,还是仅仅只是startwith。这一点是我最开始没有想到的。

剩下的就是一个字符一个字符的遍历过程了。


收获就是:

知道Trie的定义和结构。

使用exist来判断字符串是不是存在。

/**
 * Your Trie object will be instantiated and called as such:
 * Trie trie = new Trie();
 * trie.insert("lintcode");
 * trie.search("lint"); will return false
 * trie.startsWith("lint"); will return true
 */
class TrieNode {
    // Initialize your data structure here.
    char ch;
    boolean exit = false;
	public TrieNode() {
    }
	public TrieNode(char ch){
		this.ch = ch;
	}
	TrieNode[] children;
    
}

public class Trie {
    private TrieNode root;

    public Trie() {
        root = new TrieNode();
    }
    // Inserts a word into the trie.
    public void insert(String word) {
        if(word == null || word.length() == 0){
        	return;
        }
        word = word.toLowerCase();
        TrieNode pre = root;
        for(int i = 0; i < word.length();i++){
        	int index = word.charAt(i) - 'a';
        	if(pre.children == null){
        		pre.children = new TrieNode[26];
        	}
        	if(pre.children[index] == null){
        		pre.children[index] = new TrieNode(word.charAt(i));
        	}
        	if(i == word.length() -1){
        		pre.children[index].exit = true;
        	}
        	pre = pre.children[index];
        }
    }

    // Returns if the word is in the trie.
    public boolean search(String word) {
    	if(word == null || word.length() == 0){
    		return false;
    	}
    	word = word.toLowerCase();
        int length = word.length();
        TrieNode pre = root;
        for(int i = 0; i < length; i++){
        	if(pre == null){
        		return false;
        	}
        	int index = word.charAt(i) - 'a';
        	if(pre.children == null || pre.children[index] == null){
        		return false;
        	}
        	if(i == word.length() - 1 && pre.children[index].exit == false){
        		return false;
        	}
        	pre = pre.children[index];
        }
        return true;
    }

    // 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;
    	}
    	prefix = prefix.toLowerCase();
    	int length = prefix.length();
    	TrieNode pre = root;
    	for(int i = 0; i < prefix.length(); i++){
    		if(pre == null){
    			return false;
    		}
    		int index = prefix.charAt(i) - 'a';
    		if(pre.children == null || pre.children[index] == null){
    			return false;
    		}
    		pre = pre.children[index];
    	}
    	return true;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值