Trie

SDE Sheets Questions And Solutions (12 Part Series)

1 Arrays
2 Binary Tree
8 more parts…
3 Graph
4 String
5 Binary Search Tree
6 Greedy
7 Stack and Queue
8 DP
9 Heap(Priority Queue)
10 Recursion
11 Recursion and backtracking
12 Trie

Implementing Trie data structure

Striver explanation of trie data structure

<span>class</span> <span>Node</span><span>{</span>
<span>Node</span> <span>[]</span> <span>node</span> <span>=</span> <span>new</span> <span>Node</span><span>[</span><span>26</span><span>];</span>
<span>boolean</span> <span>flag</span><span>;</span>
<span>public</span> <span>Node</span><span>(){</span>
<span>}</span>
<span>public</span> <span>boolean</span> <span>containsKey</span><span>(</span><span>char</span> <span>c</span><span>){</span>
<span>return</span> <span>node</span><span>[</span><span>c</span><span>-</span><span>'a'</span><span>]!=</span><span>null</span><span>;</span>
<span>}</span>
<span>public</span> <span>void</span> <span>put</span><span>(</span><span>char</span> <span>c</span><span>,</span> <span>Node</span> <span>n</span><span>){</span>
<span>node</span><span>[</span><span>c</span><span>-</span><span>'a'</span><span>]</span> <span>=</span> <span>n</span><span>;</span>
<span>}</span>
<span>public</span> <span>Node</span> <span>get</span><span>(</span><span>char</span> <span>c</span><span>){</span>
<span>return</span> <span>node</span><span>[</span><span>c</span><span>-</span><span>'a'</span><span>];</span>
<span>}</span>
<span>public</span> <span>void</span> <span>setFlag</span><span>()</span> <span>{</span>
<span>this</span><span>.</span><span>flag</span> <span>=</span> <span>true</span><span>;</span>
<span>}</span>
<span>public</span> <span>boolean</span> <span>getFlag</span><span>(){</span>
<span>return</span> <span>this</span><span>.</span><span>flag</span><span>;</span>
<span>}</span>
<span>}</span>
<span>class</span> <span>Trie</span> <span>{</span>
<span>Node</span> <span>root</span><span>;</span>
<span>public</span> <span>Trie</span><span>()</span> <span>{</span>
<span>root</span> <span>=</span> <span>new</span> <span>Node</span><span>();</span>
<span>}</span>
<span>//will take tc : O(len) of the word</span>
<span>public</span> <span>void</span> <span>insert</span><span>(</span><span>String</span> <span>word</span><span>)</span> <span>{</span>
<span>Node</span> <span>node</span> <span>=</span> <span>root</span><span>;</span>
<span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span><span>0</span><span>;</span><span>i</span><span><</span><span>word</span><span>.</span><span>length</span><span>();</span><span>i</span><span>++){</span>
<span>if</span><span>(!</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>))){</span>
<span>node</span><span>.</span><span>put</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>),</span><span>new</span> <span>Node</span><span>());</span>
<span>}</span>
<span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>));</span>
<span>}</span>
<span>node</span><span>.</span><span>setFlag</span><span>();</span>
<span>}</span>
<span>//will take tc : O(len) of the word</span>
<span>public</span> <span>boolean</span> <span>search</span><span>(</span><span>String</span> <span>word</span><span>)</span> <span>{</span>
<span>Node</span> <span>node</span> <span>=</span> <span>root</span><span>;</span>
<span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span><span>0</span><span>;</span><span>i</span><span><</span><span>word</span><span>.</span><span>length</span><span>();</span><span>i</span><span>++){</span>
<span>if</span><span>(!</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>))){</span>
<span>return</span> <span>false</span><span>;</span>
<span>}</span>
<span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>));</span>
<span>}</span>
<span>return</span> <span>node</span><span>.</span><span>getFlag</span><span>();</span>
<span>}</span>
<span>//will take tc : O(len) of the prefix</span>
<span>public</span> <span>boolean</span> <span>startsWith</span><span>(</span><span>String</span> <span>prefix</span><span>)</span> <span>{</span>
<span>Node</span> <span>node</span> <span>=</span> <span>root</span><span>;</span>
<span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span><span>0</span><span>;</span><span>i</span><span><</span><span>prefix</span><span>.</span><span>length</span><span>();</span><span>i</span><span>++){</span>
<span>if</span><span>(!</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>prefix</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>))){</span>
<span>return</span> <span>false</span><span>;</span>
<span>}</span>
<span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>prefix</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>));</span>
<span>}</span>
<span>return</span> <span>true</span><span>;</span>
<span>}</span>
<span>}</span>
<span>/** * 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); */</span>
<span>class</span> <span>Node</span><span>{</span>
    <span>Node</span> <span>[]</span> <span>node</span> <span>=</span> <span>new</span> <span>Node</span><span>[</span><span>26</span><span>];</span>
    <span>boolean</span> <span>flag</span><span>;</span>
    <span>public</span> <span>Node</span><span>(){</span>

    <span>}</span>
    <span>public</span> <span>boolean</span> <span>containsKey</span><span>(</span><span>char</span> <span>c</span><span>){</span>
        <span>return</span> <span>node</span><span>[</span><span>c</span><span>-</span><span>'a'</span><span>]!=</span><span>null</span><span>;</span>
    <span>}</span>
    <span>public</span> <span>void</span> <span>put</span><span>(</span><span>char</span> <span>c</span><span>,</span> <span>Node</span> <span>n</span><span>){</span>
        <span>node</span><span>[</span><span>c</span><span>-</span><span>'a'</span><span>]</span>  <span>=</span> <span>n</span><span>;</span>
    <span>}</span>
    <span>public</span> <span>Node</span> <span>get</span><span>(</span><span>char</span> <span>c</span><span>){</span>
        <span>return</span> <span>node</span><span>[</span><span>c</span><span>-</span><span>'a'</span><span>];</span>
    <span>}</span>
    <span>public</span> <span>void</span> <span>setFlag</span><span>()</span> <span>{</span>
        <span>this</span><span>.</span><span>flag</span> <span>=</span> <span>true</span><span>;</span>
    <span>}</span>
    <span>public</span> <span>boolean</span> <span>getFlag</span><span>(){</span>
        <span>return</span> <span>this</span><span>.</span><span>flag</span><span>;</span>
    <span>}</span>
<span>}</span>

<span>class</span> <span>Trie</span> <span>{</span>
    <span>Node</span> <span>root</span><span>;</span>
    <span>public</span> <span>Trie</span><span>()</span> <span>{</span>
        <span>root</span> <span>=</span> <span>new</span> <span>Node</span><span>();</span>
    <span>}</span>
    <span>//will take tc : O(len) of the word</span>
    <span>public</span> <span>void</span> <span>insert</span><span>(</span><span>String</span> <span>word</span><span>)</span> <span>{</span>
        <span>Node</span> <span>node</span>  <span>=</span> <span>root</span><span>;</span>
        <span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span><span>0</span><span>;</span><span>i</span><span><</span><span>word</span><span>.</span><span>length</span><span>();</span><span>i</span><span>++){</span>
            <span>if</span><span>(!</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>))){</span>
                <span>node</span><span>.</span><span>put</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>),</span><span>new</span> <span>Node</span><span>());</span>
            <span>}</span>
            <span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>));</span>
        <span>}</span>
        <span>node</span><span>.</span><span>setFlag</span><span>();</span>
    <span>}</span>
    <span>//will take tc : O(len) of the word</span>
    <span>public</span> <span>boolean</span> <span>search</span><span>(</span><span>String</span> <span>word</span><span>)</span> <span>{</span>
        <span>Node</span> <span>node</span> <span>=</span> <span>root</span><span>;</span>
        <span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span><span>0</span><span>;</span><span>i</span><span><</span><span>word</span><span>.</span><span>length</span><span>();</span><span>i</span><span>++){</span>
            <span>if</span><span>(!</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>))){</span>
                <span>return</span> <span>false</span><span>;</span>
            <span>}</span>
            <span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>));</span>
        <span>}</span>
        <span>return</span> <span>node</span><span>.</span><span>getFlag</span><span>();</span>
    <span>}</span>
    <span>//will take tc : O(len) of the prefix</span>
    <span>public</span> <span>boolean</span> <span>startsWith</span><span>(</span><span>String</span> <span>prefix</span><span>)</span> <span>{</span>
         <span>Node</span> <span>node</span> <span>=</span> <span>root</span><span>;</span>
        <span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span><span>0</span><span>;</span><span>i</span><span><</span><span>prefix</span><span>.</span><span>length</span><span>();</span><span>i</span><span>++){</span>
            <span>if</span><span>(!</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>prefix</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>))){</span>
                <span>return</span> <span>false</span><span>;</span>
            <span>}</span>
            <span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>prefix</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>));</span>
        <span>}</span>
        <span>return</span> <span>true</span><span>;</span>
    <span>}</span>
<span>}</span>

<span>/** * 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); */</span>
class Node{ Node [] node = new Node[26]; boolean flag; public Node(){ } public boolean containsKey(char c){ return node[c-'a']!=null; } public void put(char c, Node n){ node[c-'a'] = n; } public Node get(char c){ return node[c-'a']; } public void setFlag() { this.flag = true; } public boolean getFlag(){ return this.flag; } } class Trie { Node root; public Trie() { root = new Node(); } //will take tc : O(len) of the word public void insert(String word) { Node node = root; for(int i =0;i<word.length();i++){ if(!node.containsKey(word.charAt(i))){ node.put(word.charAt(i),new Node()); } node = node.get(word.charAt(i)); } node.setFlag(); } //will take tc : O(len) of the word public boolean search(String word) { Node node = root; for(int i =0;i<word.length();i++){ if(!node.containsKey(word.charAt(i))){ return false; } node = node.get(word.charAt(i)); } return node.getFlag(); } //will take tc : O(len) of the prefix public boolean startsWith(String prefix) { Node node = root; for(int i =0;i<prefix.length();i++){ if(!node.containsKey(prefix.charAt(i))){ return false; } node = node.get(prefix.charAt(i)); } return true; } } /** * 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); */

Enter fullscreen mode Exit fullscreen mode

Trie data structure II

striver’s explanation for better understanding

<span>import</span> <span>java.util.*</span> <span>;</span>
<span>import</span> <span>java.io.*</span><span>;</span>
<span>class</span> <span>Node</span> <span>{</span>
<span>Node</span> <span>node</span><span>[]</span> <span>=</span> <span>new</span> <span>Node</span><span>[</span><span>26</span><span>];</span>
<span>int</span> <span>endWith</span> <span>=</span> <span>0</span><span>;</span><span>// will keep track of no. of words ending with this word</span>
<span>int</span> <span>countPrefix</span><span>=</span><span>0</span><span>;</span><span>// will keep track of no. of words starting with this word</span>
<span>public</span> <span>Node</span><span>(){</span>
<span>}</span>
<span>public</span> <span>boolean</span> <span>containsKey</span><span>(</span><span>char</span> <span>c</span><span>){</span>
<span>return</span> <span>node</span><span>[</span><span>c</span><span>-</span><span>'a'</span><span>]!=</span><span>null</span><span>;</span>
<span>}</span>
<span>public</span> <span>void</span> <span>put</span><span>(</span><span>char</span> <span>c</span><span>,</span> <span>Node</span> <span>n</span><span>){</span>
<span>node</span><span>[</span><span>c</span><span>-</span><span>'a'</span><span>]</span> <span>=</span> <span>n</span><span>;</span>
<span>}</span>
<span>public</span> <span>Node</span> <span>get</span><span>(</span><span>char</span> <span>c</span><span>){</span>
<span>return</span> <span>node</span><span>[</span><span>c</span><span>-</span><span>'a'</span><span>];</span>
<span>}</span>
<span>public</span> <span>void</span> <span>incrementCountPrefix</span><span>()</span> <span>{</span>
<span>++</span><span>this</span><span>.</span><span>countPrefix</span><span>;</span>
<span>}</span>
<span>public</span> <span>void</span> <span>decrementCountPrefix</span><span>(){</span>
<span>--</span><span>this</span><span>.</span><span>countPrefix</span><span>;</span>
<span>}</span>
<span>public</span> <span>void</span> <span>incrementEndWith</span><span>(){</span>
<span>++</span><span>this</span><span>.</span><span>endWith</span><span>;</span>
<span>}</span>
<span>public</span> <span>void</span> <span>deleteEndWith</span><span>(){</span>
<span>--</span><span>this</span><span>.</span><span>endWith</span><span>;</span>
<span>}</span>
<span>public</span> <span>int</span> <span>getCountPrefix</span><span>(){</span>
<span>return</span> <span>this</span><span>.</span><span>countPrefix</span><span>;</span>
<span>}</span>
<span>public</span> <span>int</span> <span>getEndWith</span><span>(){</span>
<span>return</span> <span>this</span><span>.</span><span>endWith</span><span>;</span>
<span>}</span>
<span>}</span>
<span>public</span> <span>class</span> <span>Trie</span> <span>{</span>
<span>Node</span> <span>root</span><span>;</span>
<span>public</span> <span>Trie</span><span>()</span> <span>{</span>
<span>// Write your code here.</span>
<span>root</span> <span>=</span> <span>new</span> <span>Node</span><span>();</span>
<span>}</span>
<span>public</span> <span>void</span> <span>insert</span><span>(</span><span>String</span> <span>word</span><span>)</span> <span>{</span>
<span>Node</span> <span>node</span> <span>=</span> <span>root</span><span>;</span>
<span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span><span>0</span><span>;</span><span>i</span><span><</span><span>word</span><span>.</span><span>length</span><span>();</span><span>i</span><span>++){</span>
<span>if</span><span>(!</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>))){</span>
<span>node</span><span>.</span><span>put</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>),</span><span>new</span> <span>Node</span><span>());</span>
<span>}</span>
<span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>));</span>
<span>node</span><span>.</span><span>incrementCountPrefix</span><span>();</span>
<span>}</span>
<span>node</span><span>.</span><span>incrementEndWith</span><span>();</span>
<span>}</span>
<span>public</span> <span>int</span> <span>countWordsEqualTo</span><span>(</span><span>String</span> <span>word</span><span>)</span> <span>{</span>
<span>// Write your code here. </span>
<span>Node</span> <span>node</span> <span>=</span> <span>root</span><span>;</span>
<span>for</span><span>(</span><span>int</span> <span>i</span><span>=</span><span>0</span><span>;</span><span>i</span><span><</span><span>word</span><span>.</span><span>length</span><span>();</span><span>i</span><span>++){</span>
<span>if</span><span>(</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>))){</span>
<span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>));</span>
<span>}</span>
<span>else</span> <span>return</span> <span>0</span><span>;</span>
<span>}</span>
<span>return</span> <span>node</span><span>.</span><span>getEndWith</span><span>();</span><span>//this will tell how many strings are </span>
<span>//ending with given word</span>
<span>}</span>
<span>public</span> <span>int</span> <span>countWordsStartingWith</span><span>(</span><span>String</span> <span>word</span><span>)</span> <span>{</span>
<span>Node</span> <span>node</span> <span>=</span> <span>root</span><span>;</span>
<span>for</span><span>(</span><span>int</span> <span>i</span><span>=</span><span>0</span><span>;</span><span>i</span><span><</span><span>word</span><span>.</span><span>length</span><span>();</span><span>i</span><span>++){</span>
<span>if</span><span>(</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>))){</span>
<span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>));</span>
<span>}</span>
<span>else</span> <span>return</span> <span>0</span><span>;</span>
<span>}</span>
<span>return</span> <span>node</span><span>.</span><span>getCountPrefix</span><span>();</span> <span>// it will tell how many strings are starting </span>
<span>//with given word;</span>
<span>}</span>
<span>public</span> <span>void</span> <span>erase</span><span>(</span><span>String</span> <span>word</span><span>)</span> <span>{</span>
<span>Node</span> <span>node</span> <span>=</span> <span>root</span><span>;</span>
<span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span><span>0</span><span>;</span><span>i</span><span><</span><span>word</span><span>.</span><span>length</span><span>();</span><span>i</span><span>++){</span>
<span>if</span><span>(</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>))){</span>
<span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>));</span>
<span>node</span><span>.</span><span>decrementCountPrefix</span><span>();</span>
<span>}</span>
<span>else</span> <span>return</span><span>;</span>
<span>}</span>
<span>node</span><span>.</span><span>deleteEndWith</span><span>();</span>
<span>}</span>
<span>}</span>
<span>import</span> <span>java.util.*</span> <span>;</span>
<span>import</span> <span>java.io.*</span><span>;</span> 

<span>class</span> <span>Node</span> <span>{</span>
    <span>Node</span> <span>node</span><span>[]</span> <span>=</span> <span>new</span> <span>Node</span><span>[</span><span>26</span><span>];</span>
    <span>int</span> <span>endWith</span> <span>=</span> <span>0</span><span>;</span><span>// will keep track of no. of words ending with this word</span>
    <span>int</span> <span>countPrefix</span><span>=</span><span>0</span><span>;</span><span>// will keep track of no. of words starting with this word</span>
    <span>public</span> <span>Node</span><span>(){</span>

    <span>}</span>
    <span>public</span> <span>boolean</span> <span>containsKey</span><span>(</span><span>char</span> <span>c</span><span>){</span>
        <span>return</span> <span>node</span><span>[</span><span>c</span><span>-</span><span>'a'</span><span>]!=</span><span>null</span><span>;</span>
    <span>}</span>
    <span>public</span> <span>void</span> <span>put</span><span>(</span><span>char</span> <span>c</span><span>,</span> <span>Node</span> <span>n</span><span>){</span>
        <span>node</span><span>[</span><span>c</span><span>-</span><span>'a'</span><span>]</span> <span>=</span> <span>n</span><span>;</span>
    <span>}</span>
    <span>public</span> <span>Node</span> <span>get</span><span>(</span><span>char</span> <span>c</span><span>){</span>
        <span>return</span> <span>node</span><span>[</span><span>c</span><span>-</span><span>'a'</span><span>];</span>
    <span>}</span>
    <span>public</span> <span>void</span> <span>incrementCountPrefix</span><span>()</span> <span>{</span>
        <span>++</span><span>this</span><span>.</span><span>countPrefix</span><span>;</span>
    <span>}</span>
    <span>public</span> <span>void</span> <span>decrementCountPrefix</span><span>(){</span>
        <span>--</span><span>this</span><span>.</span><span>countPrefix</span><span>;</span>
    <span>}</span>
    <span>public</span> <span>void</span> <span>incrementEndWith</span><span>(){</span>
        <span>++</span><span>this</span><span>.</span><span>endWith</span><span>;</span>
    <span>}</span>
    <span>public</span> <span>void</span> <span>deleteEndWith</span><span>(){</span>
        <span>--</span><span>this</span><span>.</span><span>endWith</span><span>;</span>
    <span>}</span>
    <span>public</span> <span>int</span> <span>getCountPrefix</span><span>(){</span>
        <span>return</span> <span>this</span><span>.</span><span>countPrefix</span><span>;</span>
    <span>}</span>
    <span>public</span> <span>int</span> <span>getEndWith</span><span>(){</span>
        <span>return</span> <span>this</span><span>.</span><span>endWith</span><span>;</span>
    <span>}</span>


<span>}</span>
<span>public</span> <span>class</span> <span>Trie</span> <span>{</span>
    <span>Node</span> <span>root</span><span>;</span>
    <span>public</span> <span>Trie</span><span>()</span> <span>{</span>
        <span>// Write your code here.</span>
        <span>root</span> <span>=</span> <span>new</span> <span>Node</span><span>();</span>
    <span>}</span>

    <span>public</span> <span>void</span> <span>insert</span><span>(</span><span>String</span> <span>word</span><span>)</span> <span>{</span>
        <span>Node</span> <span>node</span> <span>=</span> <span>root</span><span>;</span>
        <span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span><span>0</span><span>;</span><span>i</span><span><</span><span>word</span><span>.</span><span>length</span><span>();</span><span>i</span><span>++){</span>
            <span>if</span><span>(!</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>))){</span>
                <span>node</span><span>.</span><span>put</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>),</span><span>new</span> <span>Node</span><span>());</span>
            <span>}</span>
            <span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>));</span>
            <span>node</span><span>.</span><span>incrementCountPrefix</span><span>();</span>
        <span>}</span>
        <span>node</span><span>.</span><span>incrementEndWith</span><span>();</span>
    <span>}</span>

    <span>public</span> <span>int</span> <span>countWordsEqualTo</span><span>(</span><span>String</span> <span>word</span><span>)</span> <span>{</span>
        <span>// Write your code here. </span>
        <span>Node</span> <span>node</span> <span>=</span> <span>root</span><span>;</span>
        <span>for</span><span>(</span><span>int</span> <span>i</span><span>=</span><span>0</span><span>;</span><span>i</span><span><</span><span>word</span><span>.</span><span>length</span><span>();</span><span>i</span><span>++){</span>
            <span>if</span><span>(</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>))){</span>
                <span>node</span>  <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>));</span>
            <span>}</span>
            <span>else</span> <span>return</span> <span>0</span><span>;</span>

        <span>}</span>
        <span>return</span> <span>node</span><span>.</span><span>getEndWith</span><span>();</span><span>//this will tell how many strings are </span>
        <span>//ending with given word</span>

    <span>}</span>



    <span>public</span> <span>int</span> <span>countWordsStartingWith</span><span>(</span><span>String</span> <span>word</span><span>)</span> <span>{</span> 
        <span>Node</span> <span>node</span> <span>=</span> <span>root</span><span>;</span>
        <span>for</span><span>(</span><span>int</span> <span>i</span><span>=</span><span>0</span><span>;</span><span>i</span><span><</span><span>word</span><span>.</span><span>length</span><span>();</span><span>i</span><span>++){</span>
            <span>if</span><span>(</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>))){</span>
                <span>node</span>  <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>));</span>
            <span>}</span>
            <span>else</span> <span>return</span> <span>0</span><span>;</span>

        <span>}</span>
        <span>return</span>  <span>node</span><span>.</span><span>getCountPrefix</span><span>();</span> <span>// it will tell how many strings are starting </span>
        <span>//with given word;</span>
    <span>}</span>

    <span>public</span> <span>void</span> <span>erase</span><span>(</span><span>String</span> <span>word</span><span>)</span> <span>{</span>
         <span>Node</span> <span>node</span> <span>=</span> <span>root</span><span>;</span>
        <span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span><span>0</span><span>;</span><span>i</span><span><</span><span>word</span><span>.</span><span>length</span><span>();</span><span>i</span><span>++){</span>
            <span>if</span><span>(</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>))){</span>
                <span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>));</span>
                <span>node</span><span>.</span><span>decrementCountPrefix</span><span>();</span>
            <span>}</span>
            <span>else</span> <span>return</span><span>;</span>


        <span>}</span>
        <span>node</span><span>.</span><span>deleteEndWith</span><span>();</span>
    <span>}</span>

<span>}</span>
import java.util.* ; import java.io.*; class Node { Node node[] = new Node[26]; int endWith = 0;// will keep track of no. of words ending with this word int countPrefix=0;// will keep track of no. of words starting with this word public Node(){ } public boolean containsKey(char c){ return node[c-'a']!=null; } public void put(char c, Node n){ node[c-'a'] = n; } public Node get(char c){ return node[c-'a']; } public void incrementCountPrefix() { ++this.countPrefix; } public void decrementCountPrefix(){ --this.countPrefix; } public void incrementEndWith(){ ++this.endWith; } public void deleteEndWith(){ --this.endWith; } public int getCountPrefix(){ return this.countPrefix; } public int getEndWith(){ return this.endWith; } } public class Trie { Node root; public Trie() { // Write your code here. root = new Node(); } public void insert(String word) { Node node = root; for(int i =0;i<word.length();i++){ if(!node.containsKey(word.charAt(i))){ node.put(word.charAt(i),new Node()); } node = node.get(word.charAt(i)); node.incrementCountPrefix(); } node.incrementEndWith(); } public int countWordsEqualTo(String word) { // Write your code here. Node node = root; for(int i=0;i<word.length();i++){ if(node.containsKey(word.charAt(i))){ node = node.get(word.charAt(i)); } else return 0; } return node.getEndWith();//this will tell how many strings are //ending with given word } public int countWordsStartingWith(String word) { Node node = root; for(int i=0;i<word.length();i++){ if(node.containsKey(word.charAt(i))){ node = node.get(word.charAt(i)); } else return 0; } return node.getCountPrefix(); // it will tell how many strings are starting //with given word; } public void erase(String word) { Node node = root; for(int i =0;i<word.length();i++){ if(node.containsKey(word.charAt(i))){ node = node.get(word.charAt(i)); node.decrementCountPrefix(); } else return; } node.deleteEndWith(); } }

Enter fullscreen mode Exit fullscreen mode

Complete String

<span>// tc : O(n*l)</span>
<span>import</span> <span>java.util.*</span> <span>;</span>
<span>import</span> <span>java.io.*</span><span>;</span>
<span>class</span> <span>Node</span><span>{</span>
<span>Node</span><span>[]</span> <span>node</span> <span>=</span> <span>new</span> <span>Node</span><span>[</span><span>26</span><span>];</span>
<span>boolean</span> <span>flag</span><span>;</span>
<span>public</span> <span>Node</span><span>(){}</span>
<span>public</span> <span>void</span> <span>put</span><span>(</span><span>char</span> <span>c</span> <span>,</span> <span>Node</span> <span>n</span><span>){</span>
<span>node</span><span>[</span><span>c</span><span>-</span><span>'a'</span><span>]</span> <span>=</span> <span>n</span><span>;</span>
<span>}</span>
<span>public</span> <span>boolean</span> <span>containsKey</span><span>(</span><span>char</span> <span>c</span><span>){</span>
<span>return</span> <span>node</span><span>[</span><span>c</span><span>-</span><span>'a'</span><span>]!=</span><span>null</span><span>;</span>
<span>}</span>
<span>public</span> <span>Node</span> <span>get</span><span>(</span><span>char</span> <span>c</span><span>){</span>
<span>return</span> <span>node</span><span>[</span><span>c</span><span>-</span><span>'a'</span><span>];</span>
<span>}</span>
<span>public</span> <span>void</span> <span>setEnd</span><span>(){</span>
<span>this</span><span>.</span><span>flag</span> <span>=</span> <span>true</span><span>;</span>
<span>}</span>
<span>public</span> <span>boolean</span> <span>isEnd</span><span>(){</span>
<span>return</span> <span>this</span><span>.</span><span>flag</span><span>;</span>
<span>}</span>
<span>}</span>
<span>class</span> <span>Trie</span><span>{</span>
<span>Node</span> <span>root</span><span>;</span>
<span>public</span> <span>Trie</span><span>(){</span>
<span>root</span> <span>=</span> <span>new</span> <span>Node</span><span>();</span>
<span>}</span>
<span>public</span> <span>boolean</span> <span>checkIfPrefixPresent</span><span>(</span><span>String</span> <span>s</span><span>){</span>
<span>Node</span> <span>node</span> <span>=</span> <span>root</span><span>;</span>
<span>boolean</span> <span>flag</span><span>=</span> <span>true</span><span>;</span>
<span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span> <span>0</span><span>;</span><span>i</span><span><</span><span>s</span><span>.</span><span>length</span><span>();</span><span>i</span><span>++){</span>
<span>char</span> <span>c</span> <span>=</span> <span>s</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>);</span>
<span>if</span><span>(!</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>c</span><span>)){</span>
<span>return</span> <span>false</span><span>;</span>
<span>}</span>
<span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>c</span><span>);</span>
<span>flag</span> <span>=</span> <span>flag</span> <span>&&</span> <span>node</span><span>.</span><span>isEnd</span><span>();</span> <span>// this will check if the substring is also a string from the list of strings</span>
<span>//if(flag == false) return false; // this line will also work here because if any substring is not present as a string in the trie , then </span>
<span>// this string s won't be a complete string, and we can return false here only</span>
<span>}</span>
<span>return</span> <span>flag</span><span>;</span>
<span>}</span>
<span>public</span> <span>void</span> <span>insert</span><span>(</span><span>String</span> <span>s</span><span>){</span>
<span>Node</span> <span>node</span> <span>=</span> <span>root</span><span>;</span>
<span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span><span>0</span><span>;</span><span>i</span><span><</span><span>s</span><span>.</span><span>length</span><span>();</span><span>i</span><span>++){</span>
<span>char</span> <span>c</span> <span>=</span> <span>s</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>);</span>
<span>if</span><span>(!</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>c</span><span>)){</span>
<span>node</span><span>.</span><span>put</span><span>(</span><span>c</span><span>,</span> <span>new</span> <span>Node</span><span>());</span>
<span>}</span>
<span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>c</span><span>);</span>
<span>}</span>
<span>node</span><span>.</span><span>setEnd</span><span>();</span> <span>// setting end of the string as this is the </span>
<span>//end of the current string s </span>
<span>}</span>
<span>}</span>
<span>class</span> <span>Solution</span> <span>{</span>
<span>static</span> <span>Node</span> <span>root</span><span>;</span>
<span>public</span> <span>static</span> <span>String</span> <span>completeString</span><span>(</span><span>int</span> <span>n</span><span>,</span> <span>String</span><span>[]</span> <span>a</span><span>)</span> <span>{</span>
<span>Trie</span> <span>trie</span> <span>=</span> <span>new</span> <span>Trie</span><span>();</span>
<span>//storing all the string in the trie data structure</span>
<span>for</span><span>(</span><span>String</span> <span>s</span> <span>:</span> <span>a</span><span>)</span> <span>trie</span><span>.</span><span>insert</span><span>(</span><span>s</span><span>);</span>
<span>//finding out the comeplete string among all the list of strings</span>
<span>String</span> <span>completeString</span> <span>=</span> <span>""</span><span>;</span>
<span>for</span><span>(</span><span>String</span> <span>s</span> <span>:</span> <span>a</span><span>){</span>
<span>if</span><span>(</span><span>trie</span><span>.</span><span>checkIfPrefixPresent</span><span>(</span><span>s</span><span>)){</span>
<span>if</span><span>(</span><span>completeString</span><span>.</span><span>length</span><span>()</span> <span><</span> <span>s</span><span>.</span><span>length</span><span>()){</span>
<span>completeString</span> <span>=</span> <span>s</span><span>;</span>
<span>}</span>
<span>//lexographical selection : a.compareTo(b) =-1 if a < b lexographically </span>
<span>else</span> <span>if</span><span>(</span><span>completeString</span><span>.</span><span>length</span><span>()</span> <span>==</span> <span>s</span><span>.</span><span>length</span><span>()</span> <span>&&</span> <span>s</span><span>.</span><span>compareTo</span><span>(</span><span>completeString</span><span>)</span> <span><</span> <span>0</span><span>){</span>
<span>completeString</span> <span>=</span> <span>s</span><span>;</span>
<span>}</span>
<span>}</span>
<span>}</span>
<span>return</span> <span>completeString</span><span>.</span><span>equals</span><span>(</span><span>""</span><span>)</span> <span>?</span> <span>"None"</span><span>:</span><span>completeString</span><span>;</span>
<span>}</span>
<span>}</span>
<span>// tc : O(n*l)</span>

<span>import</span> <span>java.util.*</span> <span>;</span>
<span>import</span> <span>java.io.*</span><span>;</span> 

<span>class</span> <span>Node</span><span>{</span>
    <span>Node</span><span>[]</span> <span>node</span> <span>=</span> <span>new</span> <span>Node</span><span>[</span><span>26</span><span>];</span>
    <span>boolean</span> <span>flag</span><span>;</span>
    <span>public</span> <span>Node</span><span>(){}</span>
    <span>public</span> <span>void</span> <span>put</span><span>(</span><span>char</span> <span>c</span> <span>,</span> <span>Node</span> <span>n</span><span>){</span>
        <span>node</span><span>[</span><span>c</span><span>-</span><span>'a'</span><span>]</span> <span>=</span> <span>n</span><span>;</span>
    <span>}</span>
    <span>public</span> <span>boolean</span> <span>containsKey</span><span>(</span><span>char</span> <span>c</span><span>){</span>
        <span>return</span> <span>node</span><span>[</span><span>c</span><span>-</span><span>'a'</span><span>]!=</span><span>null</span><span>;</span>
    <span>}</span>
    <span>public</span> <span>Node</span> <span>get</span><span>(</span><span>char</span> <span>c</span><span>){</span>
        <span>return</span> <span>node</span><span>[</span><span>c</span><span>-</span><span>'a'</span><span>];</span>
    <span>}</span>
    <span>public</span> <span>void</span> <span>setEnd</span><span>(){</span>
        <span>this</span><span>.</span><span>flag</span> <span>=</span> <span>true</span><span>;</span>
    <span>}</span>
    <span>public</span> <span>boolean</span> <span>isEnd</span><span>(){</span>
        <span>return</span> <span>this</span><span>.</span><span>flag</span><span>;</span>
    <span>}</span>
<span>}</span>

<span>class</span> <span>Trie</span><span>{</span>
    <span>Node</span> <span>root</span><span>;</span>
    <span>public</span> <span>Trie</span><span>(){</span>
        <span>root</span> <span>=</span> <span>new</span> <span>Node</span><span>();</span>
    <span>}</span>
    <span>public</span> <span>boolean</span> <span>checkIfPrefixPresent</span><span>(</span><span>String</span> <span>s</span><span>){</span>
      <span>Node</span> <span>node</span> <span>=</span> <span>root</span><span>;</span>
      <span>boolean</span> <span>flag</span><span>=</span> <span>true</span><span>;</span>
      <span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span> <span>0</span><span>;</span><span>i</span><span><</span><span>s</span><span>.</span><span>length</span><span>();</span><span>i</span><span>++){</span>
          <span>char</span> <span>c</span> <span>=</span> <span>s</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>);</span>
          <span>if</span><span>(!</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>c</span><span>)){</span>
              <span>return</span> <span>false</span><span>;</span>
          <span>}</span>
          <span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>c</span><span>);</span>
          <span>flag</span> <span>=</span> <span>flag</span> <span>&&</span> <span>node</span><span>.</span><span>isEnd</span><span>();</span> <span>// this will check if the substring is also a string from the list of strings</span>
          <span>//if(flag == false) return false; // this line will also work here because if any substring is not present as a string in the trie , then </span>
          <span>// this string s won't be a complete string, and we can return false here only</span>
      <span>}</span>
      <span>return</span> <span>flag</span><span>;</span>
  <span>}</span>
  <span>public</span> <span>void</span> <span>insert</span><span>(</span><span>String</span> <span>s</span><span>){</span>
    <span>Node</span> <span>node</span> <span>=</span> <span>root</span><span>;</span>
    <span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span><span>0</span><span>;</span><span>i</span><span><</span><span>s</span><span>.</span><span>length</span><span>();</span><span>i</span><span>++){</span>
        <span>char</span> <span>c</span> <span>=</span> <span>s</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>);</span>
        <span>if</span><span>(!</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>c</span><span>)){</span>
            <span>node</span><span>.</span><span>put</span><span>(</span><span>c</span><span>,</span> <span>new</span> <span>Node</span><span>());</span>
        <span>}</span>
        <span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>c</span><span>);</span>
    <span>}</span>
    <span>node</span><span>.</span><span>setEnd</span><span>();</span> <span>// setting end of the string as this is the </span>
          <span>//end of the current string s </span>
  <span>}</span>
<span>}</span>
<span>class</span> <span>Solution</span> <span>{</span>
    <span>static</span> <span>Node</span> <span>root</span><span>;</span>
  <span>public</span> <span>static</span> <span>String</span> <span>completeString</span><span>(</span><span>int</span> <span>n</span><span>,</span> <span>String</span><span>[]</span> <span>a</span><span>)</span> <span>{</span>
      <span>Trie</span> <span>trie</span> <span>=</span> <span>new</span> <span>Trie</span><span>();</span>
      <span>//storing all the string in the trie data structure</span>
      <span>for</span><span>(</span><span>String</span> <span>s</span> <span>:</span> <span>a</span><span>)</span> <span>trie</span><span>.</span><span>insert</span><span>(</span><span>s</span><span>);</span>
      <span>//finding out the comeplete string among all the list of strings</span>
      <span>String</span> <span>completeString</span> <span>=</span> <span>""</span><span>;</span>
      <span>for</span><span>(</span><span>String</span> <span>s</span> <span>:</span> <span>a</span><span>){</span>
          <span>if</span><span>(</span><span>trie</span><span>.</span><span>checkIfPrefixPresent</span><span>(</span><span>s</span><span>)){</span>
              <span>if</span><span>(</span><span>completeString</span><span>.</span><span>length</span><span>()</span> <span><</span> <span>s</span><span>.</span><span>length</span><span>()){</span>
                  <span>completeString</span> <span>=</span> <span>s</span><span>;</span>
              <span>}</span>
              <span>//lexographical selection : a.compareTo(b) =-1 if a < b lexographically </span>
              <span>else</span> <span>if</span><span>(</span><span>completeString</span><span>.</span><span>length</span><span>()</span> <span>==</span> <span>s</span><span>.</span><span>length</span><span>()</span> <span>&&</span> <span>s</span><span>.</span><span>compareTo</span><span>(</span><span>completeString</span><span>)</span> <span><</span> <span>0</span><span>){</span>
                  <span>completeString</span> <span>=</span> <span>s</span><span>;</span>
              <span>}</span>
          <span>}</span>
      <span>}</span>
      <span>return</span> <span>completeString</span><span>.</span><span>equals</span><span>(</span><span>""</span><span>)</span> <span>?</span> <span>"None"</span><span>:</span><span>completeString</span><span>;</span>
  <span>}</span>
<span>}</span>
// tc : O(n*l) import java.util.* ; import java.io.*; class Node{ Node[] node = new Node[26]; boolean flag; public Node(){} public void put(char c , Node n){ node[c-'a'] = n; } public boolean containsKey(char c){ return node[c-'a']!=null; } public Node get(char c){ return node[c-'a']; } public void setEnd(){ this.flag = true; } public boolean isEnd(){ return this.flag; } } class Trie{ Node root; public Trie(){ root = new Node(); } public boolean checkIfPrefixPresent(String s){ Node node = root; boolean flag= true; for(int i = 0;i<s.length();i++){ char c = s.charAt(i); if(!node.containsKey(c)){ return false; } node = node.get(c); flag = flag && node.isEnd(); // this will check if the substring is also a string from the list of strings //if(flag == false) return false; // this line will also work here because if any substring is not present as a string in the trie , then // this string s won't be a complete string, and we can return false here only } return flag; } public void insert(String s){ Node node = root; for(int i =0;i<s.length();i++){ char c = s.charAt(i); if(!node.containsKey(c)){ node.put(c, new Node()); } node = node.get(c); } node.setEnd(); // setting end of the string as this is the //end of the current string s } } class Solution { static Node root; public static String completeString(int n, String[] a) { Trie trie = new Trie(); //storing all the string in the trie data structure for(String s : a) trie.insert(s); //finding out the comeplete string among all the list of strings String completeString = ""; for(String s : a){ if(trie.checkIfPrefixPresent(s)){ if(completeString.length() < s.length()){ completeString = s; } //lexographical selection : a.compareTo(b) =-1 if a < b lexographically else if(completeString.length() == s.length() && s.compareTo(completeString) < 0){ completeString = s; } } } return completeString.equals("") ? "None":completeString; } }

Enter fullscreen mode Exit fullscreen mode

Count distinct substring

Tc: O(n^2) for inserting different unique substring in
Trie data structure

<span>import</span> <span>java.util.ArrayList</span><span>;</span>
<span>public</span> <span>class</span> <span>Solution</span>
<span>{</span>
<span>Node</span> <span>root</span><span>;</span>
<span>static</span> <span>int</span> <span>count</span><span>;</span>
<span>public</span> <span>Solution</span><span>(){</span>
<span>root</span> <span>=</span> <span>new</span> <span>Node</span><span>();</span>
<span>}</span>
<span>public</span> <span>static</span> <span>int</span> <span>countDistinctSubstrings</span><span>(</span><span>String</span> <span>s</span><span>)</span>
<span>{</span>
<span>count</span> <span>=</span> <span>0</span><span>;</span>
<span>// Write your code here.</span>
<span>Solution</span> <span>sol</span> <span>=</span> <span>new</span> <span>Solution</span><span>();</span>
<span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span><span>0</span><span>;</span><span>i</span><span><</span> <span>s</span><span>.</span><span>length</span><span>();</span><span>i</span><span>++){</span>
<span>String</span> <span>str</span> <span>=</span> <span>""</span><span>;</span>
<span>for</span> <span>(</span><span>int</span> <span>j</span> <span>=</span><span>i</span><span>;</span><span>j</span><span><</span> <span>s</span><span>.</span><span>length</span><span>();</span><span>j</span><span>++){</span>
<span>str</span> <span>=</span> <span>str</span><span>+</span><span>s</span><span>.</span><span>charAt</span><span>(</span><span>j</span><span>);</span>
<span>sol</span><span>.</span><span>insert</span><span>(</span><span>str</span><span>);</span>
<span>}</span>
<span>}</span>
<span>return</span> <span>count</span><span>+</span><span>1</span><span>;</span>
<span>}</span>
<span>public</span> <span>void</span> <span>insert</span><span>(</span><span>String</span> <span>s</span><span>){</span>
<span>Node</span> <span>node</span> <span>=</span> <span>root</span><span>;</span>
<span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span><span>0</span><span>;</span><span>i</span><span><</span> <span>s</span><span>.</span><span>length</span><span>();</span><span>i</span><span>++){</span>
<span>if</span><span>(!</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>s</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>))){</span>
<span>node</span><span>.</span><span>put</span><span>(</span><span>s</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>),</span><span>new</span> <span>Node</span><span>());</span>
<span>count</span><span>++;</span>
<span>}</span>
<span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>s</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>));</span>
<span>}</span>
<span>node</span><span>.</span><span>setFlag</span><span>();</span>
<span>}</span>
<span>}</span>
<span>class</span> <span>Node</span> <span>{</span>
<span>Node</span> <span>node</span><span>[]</span> <span>=</span> <span>new</span> <span>Node</span><span>[</span><span>26</span><span>];</span>
<span>boolean</span> <span>flag</span><span>;</span>
<span>public</span> <span>Node</span><span>(){</span>
<span>}</span>
<span>public</span> <span>boolean</span> <span>containsKey</span><span>(</span><span>char</span> <span>c</span><span>){</span>
<span>return</span> <span>node</span><span>[</span><span>c</span><span>-</span><span>'a'</span><span>]!=</span><span>null</span><span>;</span>
<span>}</span>
<span>public</span> <span>Node</span> <span>get</span><span>(</span><span>char</span> <span>c</span><span>){</span>
<span>return</span> <span>node</span><span>[</span><span>c</span><span>-</span><span>'a'</span><span>];</span>
<span>}</span>
<span>public</span> <span>void</span> <span>put</span><span>(</span><span>char</span> <span>c</span><span>,</span> <span>Node</span> <span>n</span><span>){</span>
<span>node</span><span>[</span><span>c</span><span>-</span><span>'a'</span><span>]</span> <span>=</span> <span>n</span><span>;</span>
<span>}</span>
<span>public</span> <span>void</span> <span>setFlag</span><span>(){</span>
<span>this</span><span>.</span><span>flag</span> <span>=</span> <span>true</span><span>;</span>
<span>}</span>
<span>public</span> <span>boolean</span> <span>getFlag</span><span>(){</span>
<span>return</span> <span>this</span><span>.</span><span>flag</span><span>;</span>
<span>}</span>
<span>}</span>
<span>import</span> <span>java.util.ArrayList</span><span>;</span>

<span>public</span> <span>class</span> <span>Solution</span> 
<span>{</span>
    <span>Node</span> <span>root</span><span>;</span>
    <span>static</span> <span>int</span> <span>count</span><span>;</span>
    <span>public</span> <span>Solution</span><span>(){</span>
        <span>root</span> <span>=</span> <span>new</span> <span>Node</span><span>();</span>
    <span>}</span>

    <span>public</span> <span>static</span> <span>int</span> <span>countDistinctSubstrings</span><span>(</span><span>String</span> <span>s</span><span>)</span> 
    <span>{</span>
        <span>count</span> <span>=</span> <span>0</span><span>;</span>
        <span>// Write your code here.</span>
        <span>Solution</span> <span>sol</span> <span>=</span> <span>new</span> <span>Solution</span><span>();</span>
        <span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span><span>0</span><span>;</span><span>i</span><span><</span> <span>s</span><span>.</span><span>length</span><span>();</span><span>i</span><span>++){</span>
            <span>String</span> <span>str</span> <span>=</span> <span>""</span><span>;</span>
            <span>for</span> <span>(</span><span>int</span> <span>j</span> <span>=</span><span>i</span><span>;</span><span>j</span><span><</span> <span>s</span><span>.</span><span>length</span><span>();</span><span>j</span><span>++){</span>
                <span>str</span> <span>=</span> <span>str</span><span>+</span><span>s</span><span>.</span><span>charAt</span><span>(</span><span>j</span><span>);</span>
                <span>sol</span><span>.</span><span>insert</span><span>(</span><span>str</span><span>);</span>
            <span>}</span>
        <span>}</span>
        <span>return</span> <span>count</span><span>+</span><span>1</span><span>;</span>
    <span>}</span>
    <span>public</span> <span>void</span> <span>insert</span><span>(</span><span>String</span> <span>s</span><span>){</span>
        <span>Node</span> <span>node</span> <span>=</span> <span>root</span><span>;</span>
        <span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span><span>0</span><span>;</span><span>i</span><span><</span> <span>s</span><span>.</span><span>length</span><span>();</span><span>i</span><span>++){</span>
            <span>if</span><span>(!</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>s</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>))){</span>
                <span>node</span><span>.</span><span>put</span><span>(</span><span>s</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>),</span><span>new</span> <span>Node</span><span>());</span>
                <span>count</span><span>++;</span>
            <span>}</span>
            <span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>s</span><span>.</span><span>charAt</span><span>(</span><span>i</span><span>));</span>
        <span>}</span>
        <span>node</span><span>.</span><span>setFlag</span><span>();</span>
    <span>}</span>
<span>}</span>
<span>class</span> <span>Node</span> <span>{</span>
    <span>Node</span> <span>node</span><span>[]</span> <span>=</span> <span>new</span> <span>Node</span><span>[</span><span>26</span><span>];</span>
    <span>boolean</span> <span>flag</span><span>;</span>
    <span>public</span> <span>Node</span><span>(){</span>

    <span>}</span>
    <span>public</span> <span>boolean</span> <span>containsKey</span><span>(</span><span>char</span> <span>c</span><span>){</span>
        <span>return</span> <span>node</span><span>[</span><span>c</span><span>-</span><span>'a'</span><span>]!=</span><span>null</span><span>;</span>
    <span>}</span>
    <span>public</span> <span>Node</span> <span>get</span><span>(</span><span>char</span> <span>c</span><span>){</span>
        <span>return</span> <span>node</span><span>[</span><span>c</span><span>-</span><span>'a'</span><span>];</span>
    <span>}</span>
    <span>public</span> <span>void</span> <span>put</span><span>(</span><span>char</span> <span>c</span><span>,</span> <span>Node</span> <span>n</span><span>){</span>
        <span>node</span><span>[</span><span>c</span><span>-</span><span>'a'</span><span>]</span> <span>=</span> <span>n</span><span>;</span>
    <span>}</span>
    <span>public</span> <span>void</span> <span>setFlag</span><span>(){</span>
        <span>this</span><span>.</span><span>flag</span> <span>=</span> <span>true</span><span>;</span>
    <span>}</span>
    <span>public</span> <span>boolean</span> <span>getFlag</span><span>(){</span>
        <span>return</span> <span>this</span><span>.</span><span>flag</span><span>;</span>
    <span>}</span>
<span>}</span>
import java.util.ArrayList; public class Solution { Node root; static int count; public Solution(){ root = new Node(); } public static int countDistinctSubstrings(String s) { count = 0; // Write your code here. Solution sol = new Solution(); for(int i =0;i< s.length();i++){ String str = ""; for (int j =i;j< s.length();j++){ str = str+s.charAt(j); sol.insert(str); } } return count+1; } public void insert(String s){ Node node = root; for(int i =0;i< s.length();i++){ if(!node.containsKey(s.charAt(i))){ node.put(s.charAt(i),new Node()); count++; } node = node.get(s.charAt(i)); } node.setFlag(); } } class Node { Node node[] = new Node[26]; boolean flag; public Node(){ } public boolean containsKey(char c){ return node[c-'a']!=null; } public Node get(char c){ return node[c-'a']; } public void put(char c, Node n){ node[c-'a'] = n; } public void setFlag(){ this.flag = true; } public boolean getFlag(){ return this.flag; } }

Enter fullscreen mode Exit fullscreen mode


Maximum XOR

<span>// for more understanding refer : https://www.youtube.com/watch?v=EIhAwfHubE8&list=PLgUwDviBIf0pcIDCZnxhv0LkHf5KzG9zp&index=6</span>
<span>import</span> <span>java.util.ArrayList</span><span>;</span>
<span>public</span> <span>class</span> <span>Solution</span>
<span>{</span>
<span>public</span> <span>static</span> <span>int</span> <span>maxXOR</span><span>(</span><span>int</span> <span>n</span><span>,</span> <span>int</span> <span>m</span><span>,</span> <span>ArrayList</span><span><</span><span>Integer</span><span>></span> <span>arr1</span><span>,</span> <span>ArrayList</span><span><</span><span>Integer</span><span>></span> <span>arr2</span><span>)</span>
<span>{</span>
<span>Trie</span> <span>trie</span> <span>=</span> <span>new</span> <span>Trie</span><span>();</span>
<span>//lets put arr1 nums in the array</span>
<span>for</span><span>(</span><span>int</span> <span>num</span> <span>:</span> <span>arr1</span><span>){</span>
<span>trie</span><span>.</span><span>insert</span><span>(</span><span>num</span><span>);</span>
<span>}</span>
<span>//now find all the xor between arr2 and arr1 numbers </span>
<span>int</span> <span>maxExOr</span> <span>=</span> <span>0</span><span>;</span>
<span>for</span><span>(</span><span>int</span> <span>num</span> <span>:</span> <span>arr2</span><span>){</span>
<span>maxExOr</span> <span>=</span> <span>Integer</span><span>.</span><span>max</span><span>(</span><span>maxExOr</span><span>,</span><span>trie</span><span>.</span><span>getMaxExor</span><span>(</span><span>num</span><span>));</span>
<span>}</span>
<span>return</span> <span>maxExOr</span><span>;</span>
<span>}</span>
<span>}</span>
<span>class</span> <span>Node</span><span>{</span>
<span>Node</span> <span>node</span><span>[]</span> <span>=</span> <span>new</span> <span>Node</span><span>[</span><span>2</span><span>];</span>
<span>public</span> <span>boolean</span> <span>containsKey</span><span>(</span><span>int</span> <span>bit</span><span>){</span>
<span>return</span> <span>node</span><span>[</span><span>bit</span><span>]!=</span><span>null</span><span>;</span>
<span>}</span>
<span>public</span> <span>void</span> <span>put</span><span>(</span><span>int</span> <span>bit</span><span>,</span> <span>Node</span> <span>n</span><span>){</span>
<span>node</span><span>[</span><span>bit</span><span>]</span> <span>=</span> <span>n</span><span>;</span>
<span>}</span>
<span>public</span> <span>Node</span> <span>get</span><span>(</span><span>int</span> <span>bit</span><span>){</span>
<span>return</span> <span>node</span><span>[</span><span>bit</span><span>];</span>
<span>}</span>
<span>}</span>
<span>class</span> <span>Trie</span><span>{</span>
<span>Node</span> <span>root</span><span>;</span>
<span>public</span> <span>Trie</span><span>(){</span>
<span>root</span> <span>=</span> <span>new</span> <span>Node</span><span>();</span>
<span>}</span>
<span>public</span> <span>void</span> <span>insert</span><span>(</span><span>int</span> <span>num</span><span>){</span>
<span>Node</span> <span>node</span> <span>=</span> <span>root</span><span>;</span>
<span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span> <span>31</span><span>;</span><span>i</span><span>>=</span><span>0</span><span>;</span><span>i</span><span>--){</span>
<span>int</span> <span>bit</span> <span>=</span> <span>(</span><span>num</span><span>>></span><span>i</span><span>)&</span><span>1</span><span>;</span><span>// this will check if the bit at index i </span>
<span>//is set or not (basically this helps putting the num bits in </span>
<span>//the trie from right bit to left bit)</span>
<span>if</span><span>(!</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>bit</span><span>)){</span>
<span>node</span><span>.</span><span>put</span><span>(</span><span>bit</span><span>,</span><span>new</span> <span>Node</span><span>());</span>
<span>}</span>
<span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>bit</span><span>);</span>
<span>}</span>
<span>}</span>
<span>public</span> <span>int</span> <span>getMaxExor</span><span>(</span><span>int</span> <span>num</span><span>){</span>
<span>Node</span> <span>node</span> <span>=</span> <span>root</span><span>;</span>
<span>int</span> <span>maxNumber</span> <span>=</span> <span>0</span><span>;</span>
<span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span><span>31</span><span>;</span><span>i</span><span>>=</span><span>0</span><span>;</span><span>i</span><span>--){</span>
<span>int</span> <span>bit</span> <span>=</span> <span>(</span><span>num</span><span>>></span><span>i</span><span>)</span> <span>&</span><span>1</span><span>;</span>
<span>if</span><span>(!</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>1</span><span>-</span><span>bit</span><span>)){</span><span>// since we have to find opposite of bit at index i to get the max exor</span>
<span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>bit</span><span>);</span><span>// if we don't have reverse bit we have to settle for what we have</span>
<span>}</span>
<span>else</span><span>{</span>
<span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>1</span><span>-</span><span>bit</span><span>);</span>
<span>maxNumber</span> <span>=</span> <span>maxNumber</span> <span>|</span> <span>1</span><span><<</span><span>i</span><span>;</span> <span>// this will add the bit at ith index in the maxNumber</span>
<span>}</span>
<span>}</span>
<span>return</span> <span>maxNumber</span><span>;</span>
<span>}</span>
<span>}</span>
<span>// for more understanding refer : https://www.youtube.com/watch?v=EIhAwfHubE8&list=PLgUwDviBIf0pcIDCZnxhv0LkHf5KzG9zp&index=6</span>
<span>import</span> <span>java.util.ArrayList</span><span>;</span>
<span>public</span> <span>class</span> <span>Solution</span> 
<span>{</span>
    <span>public</span> <span>static</span> <span>int</span> <span>maxXOR</span><span>(</span><span>int</span> <span>n</span><span>,</span> <span>int</span> <span>m</span><span>,</span> <span>ArrayList</span><span><</span><span>Integer</span><span>></span> <span>arr1</span><span>,</span> <span>ArrayList</span><span><</span><span>Integer</span><span>></span> <span>arr2</span><span>)</span> 
    <span>{</span>
        <span>Trie</span> <span>trie</span> <span>=</span> <span>new</span> <span>Trie</span><span>();</span>
        <span>//lets put arr1 nums in the array</span>
        <span>for</span><span>(</span><span>int</span> <span>num</span> <span>:</span> <span>arr1</span><span>){</span>
            <span>trie</span><span>.</span><span>insert</span><span>(</span><span>num</span><span>);</span>
        <span>}</span>

        <span>//now find all the xor between arr2 and arr1 numbers </span>
        <span>int</span> <span>maxExOr</span> <span>=</span> <span>0</span><span>;</span>
        <span>for</span><span>(</span><span>int</span> <span>num</span> <span>:</span> <span>arr2</span><span>){</span>
            <span>maxExOr</span> <span>=</span> <span>Integer</span><span>.</span><span>max</span><span>(</span><span>maxExOr</span><span>,</span><span>trie</span><span>.</span><span>getMaxExor</span><span>(</span><span>num</span><span>));</span>
        <span>}</span>
        <span>return</span> <span>maxExOr</span><span>;</span>  

    <span>}</span>
<span>}</span>
<span>class</span> <span>Node</span><span>{</span>
    <span>Node</span> <span>node</span><span>[]</span> <span>=</span> <span>new</span> <span>Node</span><span>[</span><span>2</span><span>];</span>
    <span>public</span> <span>boolean</span> <span>containsKey</span><span>(</span><span>int</span> <span>bit</span><span>){</span>
        <span>return</span> <span>node</span><span>[</span><span>bit</span><span>]!=</span><span>null</span><span>;</span>
    <span>}</span>
    <span>public</span> <span>void</span> <span>put</span><span>(</span><span>int</span> <span>bit</span><span>,</span> <span>Node</span> <span>n</span><span>){</span>
        <span>node</span><span>[</span><span>bit</span><span>]</span> <span>=</span> <span>n</span><span>;</span>
    <span>}</span>
    <span>public</span> <span>Node</span> <span>get</span><span>(</span><span>int</span> <span>bit</span><span>){</span>
        <span>return</span> <span>node</span><span>[</span><span>bit</span><span>];</span>
    <span>}</span>
<span>}</span>
<span>class</span> <span>Trie</span><span>{</span>
    <span>Node</span> <span>root</span><span>;</span>
    <span>public</span> <span>Trie</span><span>(){</span>
        <span>root</span> <span>=</span> <span>new</span> <span>Node</span><span>();</span>
    <span>}</span>
    <span>public</span> <span>void</span> <span>insert</span><span>(</span><span>int</span> <span>num</span><span>){</span>
        <span>Node</span> <span>node</span>  <span>=</span> <span>root</span><span>;</span>
        <span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span> <span>31</span><span>;</span><span>i</span><span>>=</span><span>0</span><span>;</span><span>i</span><span>--){</span>
            <span>int</span>  <span>bit</span> <span>=</span> <span>(</span><span>num</span><span>>></span><span>i</span><span>)&</span><span>1</span><span>;</span><span>// this will check if the bit at index i </span>
            <span>//is set or not (basically this helps putting the num bits in </span>
            <span>//the trie from right bit to left bit)</span>
            <span>if</span><span>(!</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>bit</span><span>)){</span>
                <span>node</span><span>.</span><span>put</span><span>(</span><span>bit</span><span>,</span><span>new</span> <span>Node</span><span>());</span>
            <span>}</span>
            <span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>bit</span><span>);</span>
        <span>}</span>
    <span>}</span>
    <span>public</span> <span>int</span> <span>getMaxExor</span><span>(</span><span>int</span>  <span>num</span><span>){</span>
        <span>Node</span> <span>node</span> <span>=</span> <span>root</span><span>;</span>
        <span>int</span> <span>maxNumber</span> <span>=</span> <span>0</span><span>;</span>
        <span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span><span>31</span><span>;</span><span>i</span><span>>=</span><span>0</span><span>;</span><span>i</span><span>--){</span>
            <span>int</span> <span>bit</span> <span>=</span> <span>(</span><span>num</span><span>>></span><span>i</span><span>)</span> <span>&</span><span>1</span><span>;</span>
            <span>if</span><span>(!</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>1</span><span>-</span><span>bit</span><span>)){</span><span>// since we have to find opposite of bit at index i to get the max exor</span>
                <span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>bit</span><span>);</span><span>// if we don't have reverse bit we have to settle for what we have</span>
            <span>}</span>
            <span>else</span><span>{</span>
                <span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>1</span><span>-</span><span>bit</span><span>);</span>
                <span>maxNumber</span> <span>=</span> <span>maxNumber</span> <span>|</span> <span>1</span><span><<</span><span>i</span><span>;</span> <span>// this will add the bit at ith index in the maxNumber</span>
            <span>}</span>   
        <span>}</span>
        <span>return</span> <span>maxNumber</span><span>;</span>
    <span>}</span>
<span>}</span>
// for more understanding refer : https://www.youtube.com/watch?v=EIhAwfHubE8&list=PLgUwDviBIf0pcIDCZnxhv0LkHf5KzG9zp&index=6 import java.util.ArrayList; public class Solution { public static int maxXOR(int n, int m, ArrayList<Integer> arr1, ArrayList<Integer> arr2) { Trie trie = new Trie(); //lets put arr1 nums in the array for(int num : arr1){ trie.insert(num); } //now find all the xor between arr2 and arr1 numbers int maxExOr = 0; for(int num : arr2){ maxExOr = Integer.max(maxExOr,trie.getMaxExor(num)); } return maxExOr; } } class Node{ Node node[] = new Node[2]; public boolean containsKey(int bit){ return node[bit]!=null; } public void put(int bit, Node n){ node[bit] = n; } public Node get(int bit){ return node[bit]; } } class Trie{ Node root; public Trie(){ root = new Node(); } public void insert(int num){ Node node = root; for(int i = 31;i>=0;i--){ int bit = (num>>i)&1;// this will check if the bit at index i //is set or not (basically this helps putting the num bits in //the trie from right bit to left bit) if(!node.containsKey(bit)){ node.put(bit,new Node()); } node = node.get(bit); } } public int getMaxExor(int num){ Node node = root; int maxNumber = 0; for(int i =31;i>=0;i--){ int bit = (num>>i) &1; if(!node.containsKey(1-bit)){// since we have to find opposite of bit at index i to get the max exor node = node.get(bit);// if we don't have reverse bit we have to settle for what we have } else{ node = node.get(1-bit); maxNumber = maxNumber | 1<<i; // this will add the bit at ith index in the maxNumber } } return maxNumber; } }

Enter fullscreen mode Exit fullscreen mode

Max xor with an element of the array

Brute force approach:

<span>//tc :O(n*m) : where n is length of the queries list, and m is the size of the arr list</span>
<span>import</span> <span>java.util.*</span><span>;</span>
<span>public</span> <span>class</span> <span>Solution</span> <span>{</span>
<span>public</span> <span>static</span> <span>ArrayList</span><span><</span><span>Integer</span><span>></span> <span>maxXorQueries</span><span>(</span><span>ArrayList</span><span><</span><span>Integer</span><span>></span> <span>arr</span><span>,</span> <span>ArrayList</span><span><</span><span>ArrayList</span><span><</span><span>Integer</span><span>>></span> <span>queries</span><span>)</span> <span>{</span>
<span>ArrayList</span><span><</span><span>Integer</span><span>></span> <span>result</span> <span>=</span> <span>new</span> <span>ArrayList</span><span><>();</span>
<span>for</span><span>(</span> <span>int</span> <span>i</span> <span>=</span><span>0</span><span>;</span><span>i</span><span><</span><span>queries</span><span>.</span><span>size</span><span>();</span><span>i</span><span>++){</span>
<span>int</span> <span>X</span> <span>=</span> <span>queries</span><span>.</span><span>get</span><span>(</span><span>i</span><span>).</span><span>get</span><span>(</span><span>0</span><span>);</span>
<span>int</span> <span>A</span> <span>=</span> <span>queries</span><span>.</span><span>get</span><span>(</span><span>i</span><span>).</span><span>get</span><span>(</span><span>1</span><span>);</span>
<span>int</span> <span>max</span> <span>=</span> <span>-</span><span>1</span><span>;</span>
<span>for</span><span>(</span><span>Integer</span> <span>j</span> <span>:</span> <span>arr</span><span>){</span>
<span>if</span><span>(</span><span>j</span><span><=</span><span>A</span><span>){</span>
<span>max</span> <span>=</span> <span>Integer</span><span>.</span><span>max</span><span>(</span><span>max</span><span>,</span><span>X</span><span>^</span><span>j</span><span>);</span>
<span>}</span>
<span>}</span>
<span>result</span><span>.</span><span>add</span><span>(</span><span>max</span><span>);</span>
<span>}</span>
<span>return</span> <span>result</span><span>;</span>
<span>}</span>
<span>}</span>
<span>//tc :O(n*m) : where n is length of the queries list, and m is the size of the arr list</span>
<span>import</span> <span>java.util.*</span><span>;</span>

<span>public</span> <span>class</span> <span>Solution</span> <span>{</span>
    <span>public</span> <span>static</span> <span>ArrayList</span><span><</span><span>Integer</span><span>></span> <span>maxXorQueries</span><span>(</span><span>ArrayList</span><span><</span><span>Integer</span><span>></span> <span>arr</span><span>,</span> <span>ArrayList</span><span><</span><span>ArrayList</span><span><</span><span>Integer</span><span>>></span> <span>queries</span><span>)</span> <span>{</span>

        <span>ArrayList</span><span><</span><span>Integer</span><span>></span> <span>result</span> <span>=</span> <span>new</span> <span>ArrayList</span><span><>();</span>
        <span>for</span><span>(</span> <span>int</span> <span>i</span> <span>=</span><span>0</span><span>;</span><span>i</span><span><</span><span>queries</span><span>.</span><span>size</span><span>();</span><span>i</span><span>++){</span>
            <span>int</span> <span>X</span> <span>=</span> <span>queries</span><span>.</span><span>get</span><span>(</span><span>i</span><span>).</span><span>get</span><span>(</span><span>0</span><span>);</span>
            <span>int</span> <span>A</span> <span>=</span> <span>queries</span><span>.</span><span>get</span><span>(</span><span>i</span><span>).</span><span>get</span><span>(</span><span>1</span><span>);</span>
            <span>int</span> <span>max</span> <span>=</span> <span>-</span><span>1</span><span>;</span>
            <span>for</span><span>(</span><span>Integer</span> <span>j</span> <span>:</span> <span>arr</span><span>){</span>
                <span>if</span><span>(</span><span>j</span><span><=</span><span>A</span><span>){</span>
                    <span>max</span> <span>=</span> <span>Integer</span><span>.</span><span>max</span><span>(</span><span>max</span><span>,</span><span>X</span><span>^</span><span>j</span><span>);</span>
                <span>}</span>
            <span>}</span>
            <span>result</span><span>.</span><span>add</span><span>(</span><span>max</span><span>);</span>
        <span>}</span>
        <span>return</span> <span>result</span><span>;</span>

    <span>}</span>
<span>}</span>
//tc :O(n*m) : where n is length of the queries list, and m is the size of the arr list import java.util.*; public class Solution { public static ArrayList<Integer> maxXorQueries(ArrayList<Integer> arr, ArrayList<ArrayList<Integer>> queries) { ArrayList<Integer> result = new ArrayList<>(); for( int i =0;i<queries.size();i++){ int X = queries.get(i).get(0); int A = queries.get(i).get(1); int max = -1; for(Integer j : arr){ if(j<=A){ max = Integer.max(max,X^j); } } result.add(max); } return result; } }

Enter fullscreen mode Exit fullscreen mode

Trie approach:

<span>import</span> <span>java.util.*</span><span>;</span>
<span>class</span> <span>QueryDetails</span><span>{</span>
<span>int</span> <span>xi</span><span>;</span>
<span>int</span> <span>ai</span><span>;</span>
<span>int</span> <span>index</span><span>;</span>
<span>public</span> <span>QueryDetails</span><span>(</span><span>int</span> <span>x</span> <span>,</span><span>int</span> <span>a</span><span>,</span> <span>int</span> <span>i</span><span>){</span>
<span>this</span><span>.</span><span>xi</span> <span>=</span> <span>x</span><span>;</span>
<span>this</span><span>.</span><span>ai</span> <span>=</span> <span>a</span><span>;</span>
<span>this</span><span>.</span><span>index</span> <span>=</span> <span>i</span><span>;</span>
<span>}</span>
<span>public</span> <span>int</span> <span>getX</span><span>(){</span>
<span>return</span> <span>xi</span><span>;</span>
<span>}</span>
<span>public</span> <span>int</span> <span>getA</span><span>(){</span>
<span>return</span> <span>ai</span><span>;</span>
<span>}</span>
<span>public</span> <span>int</span> <span>getIndex</span><span>(){</span>
<span>return</span> <span>index</span><span>;</span>
<span>}</span>
<span>}</span>
<span>public</span> <span>class</span> <span>Solution</span> <span>{</span>
<span>public</span> <span>static</span> <span>ArrayList</span><span><</span><span>Integer</span><span>></span> <span>maxXorQueries</span><span>(</span><span>ArrayList</span><span><</span><span>Integer</span><span>></span> <span>arr</span><span>,</span> <span>ArrayList</span><span><</span><span>ArrayList</span><span><</span><span>Integer</span><span>>></span> <span>queries</span><span>)</span> <span>{</span>
<span>// Write your code here.</span>
<span>Trie</span> <span>trie</span> <span>=</span> <span>new</span> <span>Trie</span><span>();</span>
<span>Collections</span><span>.</span><span>sort</span><span>(</span><span>arr</span><span>);</span>
<span>PriorityQueue</span><span><</span><span>QueryDetails</span><span>></span> <span>q</span> <span>=</span> <span>new</span> <span>PriorityQueue</span><span><>((</span><span>a</span><span>,</span><span>b</span><span>)-></span> <span>a</span><span>.</span><span>getA</span><span>()-</span><span>b</span><span>.</span><span>getA</span><span>());</span>
<span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span><span>0</span><span>;</span><span>i</span><span><</span><span>queries</span><span>.</span><span>size</span><span>();</span><span>i</span><span>++){</span>
<span>q</span><span>.</span><span>add</span><span>(</span><span>new</span> <span>QueryDetails</span><span>(</span><span>queries</span><span>.</span><span>get</span><span>(</span><span>i</span><span>).</span><span>get</span><span>(</span><span>0</span><span>),</span><span>queries</span><span>.</span><span>get</span><span>(</span><span>i</span><span>).</span><span>get</span><span>(</span><span>1</span><span>),</span><span>i</span><span>));</span>
<span>}</span>
<span>ArrayList</span><span><</span><span>Integer</span><span>></span> <span>list</span> <span>=</span> <span>new</span> <span>ArrayList</span><span><>();</span>
<span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span><span>0</span><span>;</span><span>i</span><span><</span> <span>queries</span><span>.</span><span>size</span><span>();</span><span>i</span><span>++){</span>
<span>list</span><span>.</span><span>add</span><span>(-</span><span>1</span><span>);</span> <span>//intialization;// that is bound to change later</span>
<span>}</span>
<span>int</span> <span>indexOfArr</span> <span>=</span><span>0</span><span>;</span>
<span>while</span><span>(!</span><span>q</span><span>.</span><span>isEmpty</span><span>()){</span>
<span>QueryDetails</span> <span>query</span> <span>=</span> <span>q</span><span>.</span><span>remove</span><span>();</span>
<span>int</span> <span>x</span> <span>=</span> <span>query</span><span>.</span><span>getX</span><span>();</span>
<span>int</span> <span>a</span> <span>=</span> <span>query</span><span>.</span><span>getA</span><span>();</span>
<span>int</span> <span>index</span> <span>=</span> <span>query</span><span>.</span><span>getIndex</span><span>();</span>
<span>int</span> <span>max</span> <span>=</span> <span>-</span><span>1</span><span>;</span>
<span>while</span><span>(</span><span>indexOfArr</span><span><</span><span>arr</span><span>.</span><span>size</span><span>()</span> <span>&&</span> <span>arr</span><span>.</span><span>get</span><span>(</span><span>indexOfArr</span><span>)<=</span><span>a</span><span>){</span>
<span>trie</span><span>.</span><span>insert</span><span>(</span><span>arr</span><span>.</span><span>get</span><span>(</span><span>indexOfArr</span><span>));</span>
<span>indexOfArr</span><span>++;</span>
<span>}</span>
<span>//edge case what if starting value of arr(list) is greater that a in that case we can not have any exor with x(since the condition arr.get(i)<=a is not satisfied )</span>
<span>if</span><span>(</span><span>indexOfArr</span><span>==</span><span>0</span><span>)</span> <span>list</span><span>.</span><span>set</span><span>(</span><span>index</span><span>,</span> <span>-</span><span>1</span><span>);</span>
<span>else</span><span>{</span>
<span>max</span> <span>=</span> <span>trie</span><span>.</span><span>getMaxExor</span><span>(</span><span>x</span><span>);</span>
<span>list</span><span>.</span><span>set</span><span>(</span><span>index</span><span>,</span><span>max</span><span>);</span>
<span>}</span>
<span>}</span>
<span>return</span> <span>list</span><span>;</span>
<span>}</span>
<span>}</span>
<span>class</span> <span>Node</span><span>{</span>
<span>Node</span> <span>node</span><span>[]</span> <span>=</span> <span>new</span> <span>Node</span><span>[</span><span>2</span><span>];</span>
<span>public</span> <span>boolean</span> <span>containsKey</span><span>(</span><span>int</span> <span>bit</span><span>){</span>
<span>return</span> <span>node</span><span>[</span><span>bit</span><span>]!=</span><span>null</span><span>;</span>
<span>}</span>
<span>public</span> <span>void</span> <span>put</span><span>(</span><span>int</span> <span>bit</span><span>,</span> <span>Node</span> <span>n</span><span>){</span>
<span>node</span><span>[</span><span>bit</span><span>]</span> <span>=</span> <span>n</span><span>;</span>
<span>}</span>
<span>public</span> <span>Node</span> <span>get</span><span>(</span><span>int</span> <span>bit</span><span>){</span>
<span>return</span> <span>node</span><span>[</span><span>bit</span><span>];</span>
<span>}</span>
<span>}</span>
<span>class</span> <span>Trie</span><span>{</span>
<span>Node</span> <span>root</span><span>;</span>
<span>public</span> <span>Trie</span><span>(){</span>
<span>root</span> <span>=</span> <span>new</span> <span>Node</span><span>();</span>
<span>}</span>
<span>public</span> <span>void</span> <span>insert</span><span>(</span><span>int</span> <span>num</span><span>){</span>
<span>Node</span> <span>node</span> <span>=</span> <span>root</span><span>;</span>
<span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span> <span>31</span><span>;</span><span>i</span><span>>=</span><span>0</span><span>;</span><span>i</span><span>--){</span>
<span>int</span> <span>bit</span> <span>=</span> <span>(</span><span>num</span><span>>></span><span>i</span><span>)&</span><span>1</span><span>;</span><span>// this will check if the bit at index i</span>
<span>//is set or not (basically this helps putting the num bits in</span>
<span>//the trie from right bit to left bit)</span>
<span>if</span><span>(!</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>bit</span><span>)){</span>
<span>node</span><span>.</span><span>put</span><span>(</span><span>bit</span><span>,</span><span>new</span> <span>Node</span><span>());</span>
<span>}</span>
<span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>bit</span><span>);</span>
<span>}</span>
<span>}</span>
<span>public</span> <span>int</span> <span>getMaxExor</span><span>(</span><span>int</span> <span>num</span><span>){</span>
<span>Node</span> <span>node</span> <span>=</span> <span>root</span><span>;</span>
<span>int</span> <span>maxNumber</span> <span>=</span> <span>0</span> <span>;</span>
<span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span><span>31</span><span>;</span><span>i</span><span>>=</span><span>0</span><span>;</span><span>i</span><span>--){</span>
<span>int</span> <span>bit</span> <span>=</span> <span>(</span><span>num</span><span>>></span><span>i</span><span>)</span> <span>&</span><span>1</span><span>;</span>
<span>if</span><span>(</span><span>node</span><span>!=</span><span>null</span> <span>&&</span> <span>!</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>1</span><span>-</span><span>bit</span><span>)){</span><span>// since we have to find opposite of bit at index i to get the max exor</span>
<span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>bit</span><span>);</span><span>// if we don't have reverse bit we have to settle for what we have</span>
<span>}</span>
<span>else</span><span>{</span>
<span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>1</span><span>-</span><span>bit</span><span>);</span>
<span>maxNumber</span> <span>=</span> <span>maxNumber</span> <span>|</span> <span>1</span><span><<</span><span>i</span><span>;</span> <span>// this will add the bit at ith index in the maxNumber</span>
<span>}</span>
<span>}</span>
<span>return</span> <span>maxNumber</span><span>;</span>
<span>}</span>
<span>}</span>
<span>import</span> <span>java.util.*</span><span>;</span>

<span>class</span> <span>QueryDetails</span><span>{</span>
    <span>int</span> <span>xi</span><span>;</span>
    <span>int</span> <span>ai</span><span>;</span>
    <span>int</span> <span>index</span><span>;</span>
    <span>public</span> <span>QueryDetails</span><span>(</span><span>int</span> <span>x</span> <span>,</span><span>int</span> <span>a</span><span>,</span> <span>int</span> <span>i</span><span>){</span>
        <span>this</span><span>.</span><span>xi</span> <span>=</span> <span>x</span><span>;</span>
        <span>this</span><span>.</span><span>ai</span> <span>=</span> <span>a</span><span>;</span>
        <span>this</span><span>.</span><span>index</span> <span>=</span> <span>i</span><span>;</span>
    <span>}</span>
    <span>public</span> <span>int</span> <span>getX</span><span>(){</span>
        <span>return</span> <span>xi</span><span>;</span>
    <span>}</span>
    <span>public</span> <span>int</span> <span>getA</span><span>(){</span>
        <span>return</span> <span>ai</span><span>;</span>
    <span>}</span>
    <span>public</span> <span>int</span> <span>getIndex</span><span>(){</span>
        <span>return</span> <span>index</span><span>;</span>
    <span>}</span>
<span>}</span>
<span>public</span> <span>class</span> <span>Solution</span> <span>{</span>
    <span>public</span> <span>static</span> <span>ArrayList</span><span><</span><span>Integer</span><span>></span> <span>maxXorQueries</span><span>(</span><span>ArrayList</span><span><</span><span>Integer</span><span>></span> <span>arr</span><span>,</span> <span>ArrayList</span><span><</span><span>ArrayList</span><span><</span><span>Integer</span><span>>></span> <span>queries</span><span>)</span> <span>{</span>
        <span>// Write your code here.</span>
        <span>Trie</span> <span>trie</span> <span>=</span> <span>new</span> <span>Trie</span><span>();</span>
        <span>Collections</span><span>.</span><span>sort</span><span>(</span><span>arr</span><span>);</span>
        <span>PriorityQueue</span><span><</span><span>QueryDetails</span><span>></span> <span>q</span> <span>=</span> <span>new</span> <span>PriorityQueue</span><span><>((</span><span>a</span><span>,</span><span>b</span><span>)-></span> <span>a</span><span>.</span><span>getA</span><span>()-</span><span>b</span><span>.</span><span>getA</span><span>());</span>
        <span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span><span>0</span><span>;</span><span>i</span><span><</span><span>queries</span><span>.</span><span>size</span><span>();</span><span>i</span><span>++){</span>
            <span>q</span><span>.</span><span>add</span><span>(</span><span>new</span> <span>QueryDetails</span><span>(</span><span>queries</span><span>.</span><span>get</span><span>(</span><span>i</span><span>).</span><span>get</span><span>(</span><span>0</span><span>),</span><span>queries</span><span>.</span><span>get</span><span>(</span><span>i</span><span>).</span><span>get</span><span>(</span><span>1</span><span>),</span><span>i</span><span>));</span>
        <span>}</span>
        <span>ArrayList</span><span><</span><span>Integer</span><span>></span> <span>list</span>  <span>=</span> <span>new</span> <span>ArrayList</span><span><>();</span>
        <span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span><span>0</span><span>;</span><span>i</span><span><</span> <span>queries</span><span>.</span><span>size</span><span>();</span><span>i</span><span>++){</span>
            <span>list</span><span>.</span><span>add</span><span>(-</span><span>1</span><span>);</span> <span>//intialization;// that is bound to change later</span>
        <span>}</span>

        <span>int</span> <span>indexOfArr</span> <span>=</span><span>0</span><span>;</span>
        <span>while</span><span>(!</span><span>q</span><span>.</span><span>isEmpty</span><span>()){</span>
            <span>QueryDetails</span> <span>query</span> <span>=</span> <span>q</span><span>.</span><span>remove</span><span>();</span>
            <span>int</span> <span>x</span> <span>=</span> <span>query</span><span>.</span><span>getX</span><span>();</span>
            <span>int</span> <span>a</span> <span>=</span> <span>query</span><span>.</span><span>getA</span><span>();</span>
            <span>int</span> <span>index</span> <span>=</span> <span>query</span><span>.</span><span>getIndex</span><span>();</span>
            <span>int</span> <span>max</span> <span>=</span> <span>-</span><span>1</span><span>;</span>
            <span>while</span><span>(</span><span>indexOfArr</span><span><</span><span>arr</span><span>.</span><span>size</span><span>()</span> <span>&&</span> <span>arr</span><span>.</span><span>get</span><span>(</span><span>indexOfArr</span><span>)<=</span><span>a</span><span>){</span>
                <span>trie</span><span>.</span><span>insert</span><span>(</span><span>arr</span><span>.</span><span>get</span><span>(</span><span>indexOfArr</span><span>));</span>
                <span>indexOfArr</span><span>++;</span>
            <span>}</span>
            <span>//edge case what if starting value of arr(list) is greater that a in that case we can not have any exor with x(since the condition arr.get(i)<=a is not satisfied )</span>
            <span>if</span><span>(</span><span>indexOfArr</span><span>==</span><span>0</span><span>)</span> <span>list</span><span>.</span><span>set</span><span>(</span><span>index</span><span>,</span> <span>-</span><span>1</span><span>);</span>
            <span>else</span><span>{</span>
                <span>max</span> <span>=</span>  <span>trie</span><span>.</span><span>getMaxExor</span><span>(</span><span>x</span><span>);</span> 
                <span>list</span><span>.</span><span>set</span><span>(</span><span>index</span><span>,</span><span>max</span><span>);</span>
            <span>}</span>

        <span>}</span>
        <span>return</span> <span>list</span><span>;</span>
    <span>}</span>
<span>}</span>
<span>class</span> <span>Node</span><span>{</span>
    <span>Node</span> <span>node</span><span>[]</span> <span>=</span> <span>new</span> <span>Node</span><span>[</span><span>2</span><span>];</span>
    <span>public</span> <span>boolean</span> <span>containsKey</span><span>(</span><span>int</span> <span>bit</span><span>){</span>
        <span>return</span> <span>node</span><span>[</span><span>bit</span><span>]!=</span><span>null</span><span>;</span>
    <span>}</span>
    <span>public</span> <span>void</span> <span>put</span><span>(</span><span>int</span> <span>bit</span><span>,</span> <span>Node</span> <span>n</span><span>){</span>
        <span>node</span><span>[</span><span>bit</span><span>]</span> <span>=</span> <span>n</span><span>;</span>
    <span>}</span>
    <span>public</span> <span>Node</span> <span>get</span><span>(</span><span>int</span> <span>bit</span><span>){</span>
        <span>return</span> <span>node</span><span>[</span><span>bit</span><span>];</span>
    <span>}</span>
<span>}</span>
<span>class</span> <span>Trie</span><span>{</span>
    <span>Node</span> <span>root</span><span>;</span>
    <span>public</span> <span>Trie</span><span>(){</span>
        <span>root</span> <span>=</span> <span>new</span> <span>Node</span><span>();</span>
    <span>}</span>
    <span>public</span> <span>void</span> <span>insert</span><span>(</span><span>int</span> <span>num</span><span>){</span>
        <span>Node</span> <span>node</span>  <span>=</span> <span>root</span><span>;</span>
        <span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span> <span>31</span><span>;</span><span>i</span><span>>=</span><span>0</span><span>;</span><span>i</span><span>--){</span>
            <span>int</span>  <span>bit</span> <span>=</span> <span>(</span><span>num</span><span>>></span><span>i</span><span>)&</span><span>1</span><span>;</span><span>// this will check if the bit at index i</span>
            <span>//is set or not (basically this helps putting the num bits in</span>
            <span>//the trie from right bit to left bit)</span>
            <span>if</span><span>(!</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>bit</span><span>)){</span>
                <span>node</span><span>.</span><span>put</span><span>(</span><span>bit</span><span>,</span><span>new</span> <span>Node</span><span>());</span>
            <span>}</span>
            <span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>bit</span><span>);</span>
        <span>}</span>
    <span>}</span>
    <span>public</span> <span>int</span> <span>getMaxExor</span><span>(</span><span>int</span>  <span>num</span><span>){</span>
        <span>Node</span> <span>node</span> <span>=</span> <span>root</span><span>;</span>
        <span>int</span> <span>maxNumber</span> <span>=</span> <span>0</span> <span>;</span>
        <span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span><span>31</span><span>;</span><span>i</span><span>>=</span><span>0</span><span>;</span><span>i</span><span>--){</span>
            <span>int</span> <span>bit</span> <span>=</span> <span>(</span><span>num</span><span>>></span><span>i</span><span>)</span> <span>&</span><span>1</span><span>;</span>
            <span>if</span><span>(</span><span>node</span><span>!=</span><span>null</span> <span>&&</span> <span>!</span><span>node</span><span>.</span><span>containsKey</span><span>(</span><span>1</span><span>-</span><span>bit</span><span>)){</span><span>// since we have to find opposite of bit at index i to get the max exor</span>
                <span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>bit</span><span>);</span><span>// if we don't have reverse bit we have to settle for what we have</span>
            <span>}</span>
            <span>else</span><span>{</span>
                <span>node</span> <span>=</span> <span>node</span><span>.</span><span>get</span><span>(</span><span>1</span><span>-</span><span>bit</span><span>);</span>
                <span>maxNumber</span> <span>=</span> <span>maxNumber</span> <span>|</span> <span>1</span><span><<</span><span>i</span><span>;</span> <span>// this will add the bit at ith index in the maxNumber</span>
            <span>}</span>
        <span>}</span>
        <span>return</span> <span>maxNumber</span><span>;</span>
    <span>}</span>
<span>}</span>
import java.util.*; class QueryDetails{ int xi; int ai; int index; public QueryDetails(int x ,int a, int i){ this.xi = x; this.ai = a; this.index = i; } public int getX(){ return xi; } public int getA(){ return ai; } public int getIndex(){ return index; } } public class Solution { public static ArrayList<Integer> maxXorQueries(ArrayList<Integer> arr, ArrayList<ArrayList<Integer>> queries) { // Write your code here. Trie trie = new Trie(); Collections.sort(arr); PriorityQueue<QueryDetails> q = new PriorityQueue<>((a,b)-> a.getA()-b.getA()); for(int i =0;i<queries.size();i++){ q.add(new QueryDetails(queries.get(i).get(0),queries.get(i).get(1),i)); } ArrayList<Integer> list = new ArrayList<>(); for(int i =0;i< queries.size();i++){ list.add(-1); //intialization;// that is bound to change later } int indexOfArr =0; while(!q.isEmpty()){ QueryDetails query = q.remove(); int x = query.getX(); int a = query.getA(); int index = query.getIndex(); int max = -1; while(indexOfArr<arr.size() && arr.get(indexOfArr)<=a){ trie.insert(arr.get(indexOfArr)); indexOfArr++; } //edge case what if starting value of arr(list) is greater that a in that case we can not have any exor with x(since the condition arr.get(i)<=a is not satisfied ) if(indexOfArr==0) list.set(index, -1); else{ max = trie.getMaxExor(x); list.set(index,max); } } return list; } } class Node{ Node node[] = new Node[2]; public boolean containsKey(int bit){ return node[bit]!=null; } public void put(int bit, Node n){ node[bit] = n; } public Node get(int bit){ return node[bit]; } } class Trie{ Node root; public Trie(){ root = new Node(); } public void insert(int num){ Node node = root; for(int i = 31;i>=0;i--){ int bit = (num>>i)&1;// this will check if the bit at index i //is set or not (basically this helps putting the num bits in //the trie from right bit to left bit) if(!node.containsKey(bit)){ node.put(bit,new Node()); } node = node.get(bit); } } public int getMaxExor(int num){ Node node = root; int maxNumber = 0 ; for(int i =31;i>=0;i--){ int bit = (num>>i) &1; if(node!=null && !node.containsKey(1-bit)){// since we have to find opposite of bit at index i to get the max exor node = node.get(bit);// if we don't have reverse bit we have to settle for what we have } else{ node = node.get(1-bit); maxNumber = maxNumber | 1<<i; // this will add the bit at ith index in the maxNumber } } return maxNumber; } }

Enter fullscreen mode Exit fullscreen mode

SDE Sheets Questions And Solutions (12 Part Series)

1 Arrays
2 Binary Tree
8 more parts…
3 Graph
4 String
5 Binary Search Tree
6 Greedy
7 Stack and Queue
8 DP
9 Heap(Priority Queue)
10 Recursion
11 Recursion and backtracking
12 Trie

原文链接:Trie

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
Mankind is made great or little by its own will.
一个人伟大或渺小,取决于他的意志力
评论 抢沙发

请登录后发表评论

    暂无评论内容