import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.List;
import java.util.ArrayList;
/**
* Class represents trie
*/
class TrieNode
{
boolean isLeaf = false; // set when node is a leaf node
Map
<String, TrieNode
> children
= new HashMap
<>();
public void insert
(String str
) { if (str != null && !str.isEmpty()) {
String[] strSeq
= str.
split("[\\s]+");
// start from current node
TrieNode curr = this;
for (int i = 0; i < strSeq.length; i++)
{
// create a new node if path doesn't exists
if (!curr.children.containsKey(strSeq[i])) {
curr.children.put(strSeq[i], new TrieNode());
}
// go to next node
curr = curr.children.get(strSeq[i]);
}
curr.isLeaf = true;
}
}
public HashSet<TrieNode> getChildrenTrieNodes() {
HashSet<TrieNode> res = new HashSet<>();
for (String c
: children.
keySet()) { res.add(children.get(c));
}
return res;
}
public void printTrie() {
printTrieWithParams(this,0);
}
private void printTrieWithParams(TrieNode node, int offset) {
offset += 1;
for (TrieNode tn:node.getChildrenTrieNodes()) {
Iterator
<Map.
Entry<String, TrieNode
>> it
= node.
children.
entrySet().
iterator(); if (it.hasNext()) {
Map.
Entry<String, TrieNode
> entry
= it.
next();
for (int i = 0; i < offset; i++) {
}
System.
out.
println(entry.
getKey());
if(node.isLeaf) {
}
node = entry.getValue();
printTrieWithParams(node,offset);
}
}
}
}
public class Main {
public static void main
(String[] args
) { TrieNode trie = new TrieNode();
List<String> inputs = new ArrayList<>();
String input_2
= "1 2 3 STRING HERE";
inputs.add(input_0);
inputs.add(input_1);
inputs.add(input_2);
trie.insert(s);
}
trie.printTrie();
}
}
aW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwppbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CmltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CmltcG9ydCBqYXZhLnV0aWwuTWFwOwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwoKCi8qKgogKiBDbGFzcyByZXByZXNlbnRzIHRyaWUKICovCmNsYXNzIFRyaWVOb2RlCnsKICAgIGJvb2xlYW4gaXNMZWFmID0gZmFsc2U7ICAgIC8vIHNldCB3aGVuIG5vZGUgaXMgYSBsZWFmIG5vZGUKICAgIE1hcDxTdHJpbmcsIFRyaWVOb2RlPiBjaGlsZHJlbiA9IG5ldyBIYXNoTWFwPD4oKTsKCiAgICBwdWJsaWMgdm9pZCBpbnNlcnQoU3RyaW5nIHN0cikgewogICAgICAgIGlmIChzdHIgIT0gbnVsbCAmJiAhc3RyLmlzRW1wdHkoKSkgewogICAgICAgICAgICBTdHJpbmdbXSBzdHJTZXEgPSBzdHIuc3BsaXQoIltcXHNdKyIpOwoKICAgICAgICAgICAgLy8gc3RhcnQgZnJvbSBjdXJyZW50IG5vZGUKICAgICAgICAgICAgVHJpZU5vZGUgY3VyciA9IHRoaXM7CgogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0clNlcS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IG5vZGUgaWYgcGF0aCBkb2Vzbid0IGV4aXN0cwogICAgICAgICAgICAgICAgaWYgKCFjdXJyLmNoaWxkcmVuLmNvbnRhaW5zS2V5KHN0clNlcVtpXSkpIHsKICAgICAgICAgICAgICAgICAgICBjdXJyLmNoaWxkcmVuLnB1dChzdHJTZXFbaV0sIG5ldyBUcmllTm9kZSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIGdvIHRvIG5leHQgbm9kZQogICAgICAgICAgICAgICAgY3VyciA9IGN1cnIuY2hpbGRyZW4uZ2V0KHN0clNlcVtpXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGN1cnIuaXNMZWFmID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHB1YmxpYyBIYXNoU2V0PFRyaWVOb2RlPiBnZXRDaGlsZHJlblRyaWVOb2RlcygpIHsKICAgICAgICBIYXNoU2V0PFRyaWVOb2RlPiByZXMgPSBuZXcgIEhhc2hTZXQ8PigpOwogICAgICAgIGZvciAoU3RyaW5nIGM6IGNoaWxkcmVuLmtleVNldCgpKSB7CiAgICAgICAgICAgIHJlcy5hZGQoY2hpbGRyZW4uZ2V0KGMpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlczsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBwcmludFRyaWUoKSB7CiAgICAgICAgcHJpbnRUcmllV2l0aFBhcmFtcyh0aGlzLDApOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBwcmludFRyaWVXaXRoUGFyYW1zKFRyaWVOb2RlIG5vZGUsIGludCBvZmZzZXQpIHsKICAgICAgICBvZmZzZXQgKz0gMTsKCiAgICAgICAgZm9yIChUcmllTm9kZSB0bjpub2RlLmdldENoaWxkcmVuVHJpZU5vZGVzKCkpIHsKICAgICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgVHJpZU5vZGU+PiBpdCA9IG5vZGUuY2hpbGRyZW4uZW50cnlTZXQoKS5pdGVyYXRvcigpOwogICAgICAgICAgICBpZiAoaXQuaGFzTmV4dCgpKSB7CgogICAgICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgVHJpZU5vZGU+IGVudHJ5ID0gaXQubmV4dCgpOwoKICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2Zmc2V0OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGVudHJ5LmdldEtleSgpKTsKCiAgICAgICAgICAgICAgICBpZihub2RlLmlzTGVhZikgewogICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG5vZGUgPSBlbnRyeS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgcHJpbnRUcmllV2l0aFBhcmFtcyhub2RlLG9mZnNldCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAKfQoKcHVibGljIGNsYXNzIE1haW4gewogIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCVRyaWVOb2RlIHRyaWUgPSBuZXcgVHJpZU5vZGUoKTsKCUxpc3Q8U3RyaW5nPiBpbnB1dHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKCQoJU3RyaW5nIGlucHV0XzAgPSAiYWJjZCI7CiAgICBTdHJpbmcgaW5wdXRfMSA9ICJhYmNkIGFiY2QiOwogICAgU3RyaW5nIGlucHV0XzIgPSAiMSAyIDMgU1RSSU5HIEhFUkUiOwoKICAgIGlucHV0cy5hZGQoaW5wdXRfMCk7CiAgICBpbnB1dHMuYWRkKGlucHV0XzEpOwogICAgaW5wdXRzLmFkZChpbnB1dF8yKTsKICAgIAogICAgCiAgICAgICAgZm9yIChTdHJpbmcgcyA6IGlucHV0cykgewogICAgICAgICAgICB0cmllLmluc2VydChzKTsKICAgICAgICB9CiAgICAgICAgCiAgICB0cmllLnByaW50VHJpZSgpOwogIH0KfQ==