Trie 树
Leetcode: https://leetcode.com/problems/implement-trie-prefix-tree/
class Trie { Character curChar; boolean isEnd; Map<Character, Trie> children = new HashMap<>(); public Trie() {} public Trie(char ch){ curChar = ch; isEnd = false; } public void insert(String word) { if(word == null || word.isEmpty()){ //here to mark the end of a word for the last char isEnd = true; return; } char cur = word.charAt(0); if(children.containsKey(cur)){ Trie child = children.get(cur); child.insert(word.substring(1)); }else{ Trie newNode = new Trie(cur); children.put(cur,newNode); newNode.insert(word.substring(1)); } } public boolean search(String word) { return searchHelper(word, false); } public boolean startsWith(String prefix) { return searchHelper(prefix, true); } private boolean searchHelper(String word, boolean isPrefixSearch){ if(word == null || word.isEmpty()){ return false; } char cur = word.charAt(0); if(children.containsKey(cur)){ if(word.length() == 1){ //for the last char of the word Trie child = children.get(cur); boolean end = child.children.isEmpty()|child.isEnd; return isPrefixSearch?true:end; }else{ return children.get(cur).searchHelper(word.substring(1), isPrefixSearch); } }else{ return false; } } } /** * Your Trie object will be instantiated and called as such: * Trie obj = new Trie(); * obj.insert(word); * boolean param_2 = obj.search(word); * boolean param_3 = obj.startsWith(prefix); */
实现一个trie树,快速返回包含某个前缀的单词数量。
http://hihocoder.com/problemset/problem/1014
import java.io.File; import java.io.FileNotFoundException; import java.io.PrintStream; import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class Main { public static void main(String[] args) throws FileNotFoundException { TrieNode root = new TrieNode('1'); // Scanner in = new Scanner(new File("A.in")); // PrintStream out = new PrintStream(new File("A.out")); Scanner in = new Scanner(System.in); PrintStream out = new PrintStream(System.out); int n = in.nextInt(); for (int i = 0; i < n; i++) { String str = in.next(); root.insert(str); } int m = in.nextInt(); for (int i = 0; i < m; i++) { String str = in.next(); out.println(root.getCount(str)); } } } class TrieNode { Character curChar; Map<Character, TrieNode> children = new HashMap<Character, TrieNode>(); int count = 1; public TrieNode(char ch) { curChar = ch; } public void insert(String str) { if (str.isEmpty()) return; char cur = str.charAt(0); if (children.containsKey(cur)) { TrieNode child = children.get(cur); child.count++; child.insert(str.substring(1)); } else { TrieNode newNode = new TrieNode(cur); children.put(cur, newNode); newNode.insert(str.substring(1)); } } public int getCount(String str) { if (str == null) return 0; if (str.isEmpty()) { return count; } char ch = str.charAt(0); if (!children.containsKey(ch)) { return 0; } else return children.get(ch).getCount(str.substring(1)); } }