-
Notifications
You must be signed in to change notification settings - Fork 34
Expand file tree
/
Copy pathtrie.rb
More file actions
54 lines (45 loc) · 1.11 KB
/
trie.rb
File metadata and controls
54 lines (45 loc) · 1.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
require 'set'
class Trie
attr_accessor :children, :value, :flag
def initialize value=nil
@children = {}
@value = value
@flag = false #flag to represent that a word ends at this node
end
def add char
val = value ? value + char : char
children[char] = Trie.new val
end
def insert word
node = self
word.each_char do |char|
node.add char if not node.children.has_key? char
node = node.children[char]
end
node.flag = true
end
def find word
node = self
word.each_char do |char|
return nil if not node.children.has_key? char
node = node.children[char]
end
return node.value
end
def all_prefixes
results = Set.new
results.add value if flag
return results if children.empty?
ap = children.values.collect {|node| node.all_prefixes}
reduced = ap.reduce {|a,b| a.merge b}
reduced or results
end
def autocomplete prefix
node = self
prefix.each_char do |char|
return Set.new if not node.children.has_key? char
node = node.children[char]
end
return node.all_prefixes
end
end