Build tries from a list of <word, freq> pairs. Save top 10 for each node.
Example
Example1
Input:
<"abc", 2>
<"ac", 4>
<"ab", 9>
Output:<a[9,4,2]<b[9,2]<c[2]<>>c[4]<>>>
Explanation:
Root
/
a(9,4,2)
/ \
b(9,2) c(4)
/
c(2)
Example2
Input:
<"a", 10>
<"c", 41>
<"b", 50>
<"abc", 5>
Output: <a[10,5]<b[5]<c[5]<>>>b[50]<>c[41]<>>
Code (Java):/** * Definition of TrieNode: * public class TrieNode { * public NavigableMap<Character, TrieNode> children; * public List<Integer> top10; * public TrieNode() { * children = new TreeMap<Character, TrieNode>(); * top10 = new ArrayList<Integer>(); * } * } */ public class TrieService { private TrieNode root = null; public TrieService() { root = new TrieNode(); } public TrieNode getRoot() { // Return root of trie root, and // lintcode will print the tree struct. return root; } // @param word a string // @param frequency an integer public void insert(String word, int frequency) { TrieNode p = root; for (char c : word.toCharArray()) { TrieNode child = p.children.getOrDefault(c, new TrieNode()); PriorityQueue<Integer> pq = new PriorityQueue<>(child.top10); if (pq.size() < 10) { pq.offer(frequency); } else { if (frequency > pq.peek()) { pq.poll(); pq.offer(frequency); } } List<Integer> sortedList = new ArrayList<>(pq); Collections.sort(sortedList, Collections.reverseOrder()); child.top10 = sortedList; p.children.put(c, child); p = child; } } }
No comments:
Post a Comment