【Leetcode】Implement Trie (Prefix Tree)

题目链接:https://leetcode.com/problems/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.

思路:

每个结点包括三个属性:结点代表的字符、指向儿子结点的指针、代表该结点是否是word。最后一个属性是因为word不一定是从根到叶结点的路径。比如insert("abc")、insert("ab"),search("ab")应该返回true。因为之前插入了ab,哪怕b不是叶结点,所以结点要有一个属性表示从root到该是否为word。

算法:

import java.util.HashMap;

class TrieNode {
	// Initialize your data structure here.
	String val = "";
	HashMap<String, TrieNode> nexts = new HashMap<String, TrieNode>();
	boolean isword = false;
	public TrieNode() {
	}
}

public class Trie {
	private TrieNode root;

	public Trie() {
		root = new TrieNode();
	}

	// Inserts a word into the trie.
	public void insert(String word) {
		TrieNode p = root;
		for (int i = 0; i < word.length(); i++) {
			String key = word.charAt(i) + "";
			if (p.nexts.containsKey(key)) {
				p = p.nexts.get(key);
			} else {
				TrieNode t = new TrieNode();
				t.val = key;
				p.nexts.put(key, t);
				p = t;
			}
			if(i==word.length()-1){
				p.isword = true;
			}
		}
		System.out.println(p.val+":"+p.isword);
	}

	// Returns if the word is in the trie.
	public boolean search(String word) {
		TrieNode p = root;
		for (int i = 0; i < word.length(); i++) {
			String key = word.charAt(i) + "";
			if (p.nexts.containsKey(key)) {
				p = p.nexts.get(key);
			} else {
				return false;
			}
		}
		if (p.nexts.size() == 0)
			return true;
		else if(!p.isword)
			return false;
		else
			return true;
	}

	// Returns if there is any word in the trie
	// that starts with the given prefix.
	public boolean startsWith(String prefix) {
		TrieNode p = root;
		for (int i = 0; i < prefix.length(); i++) {
			String key = prefix.charAt(i) + "";
			if (p.nexts.containsKey(key)) {
				p = p.nexts.get(key);
			} else {
				return false;
			}
		}
		return true;
	}
}


你可能感兴趣的:(【Leetcode】Implement Trie (Prefix Tree))