1 minute read

Problem Statement

leetcode problem link

My Solution [Accepted]

public class TrieNode {
    public bool IsWord { set; get; }
    public Dictionary<char, TrieNode> Children { set; get;} = new ();
}

public class Trie {
    private TrieNode _root;

    public Trie() {
        _root = new ();
    }

    public void Insert(string word) {
        var curr = _root;
        foreach(var c in word) {
            if (!curr.Children.ContainsKey(c)) {
                curr.Children[c] = new TrieNode();
            }
            curr = curr.Children[c];
        }
        curr.IsWord = true;
    }

    public bool Search(string word) {
        var curr = _root;
        foreach (var c in word) {
            if (!curr.Children.ContainsKey(c)) return false;
            curr = curr.Children[c];
        }

        return curr.IsWord;
    }

    public bool StartsWith(string prefix) {
        var curr = _root;
        foreach (var c in prefix) {
            if (!curr.Children.ContainsKey(c)) return false;
            curr = curr.Children[c];
        }
        return true;
    }
}

/**
 * Your Trie object will be instantiated and called as such:
 * Trie obj = new Trie();
 * obj.Insert(word);
 * bool param_2 = obj.Search(word);
 * bool param_3 = obj.StartsWith(prefix);
 */

Editorial

class TrieNode:
    def __init__(self):
        # Initialize links array and isEnd flag
        self.links = [None] * 26
        self.is_end = False

    def contains_key(self, ch: str) -> bool:
        return self.links[ord(ch) - ord('a')] is not None

    def get(self, ch: str) -> 'TrieNode':
        return self.links[ord(ch) - ord('a')]

    def put(self, ch: str, node: 'TrieNode') -> None:
        self.links[ord(ch) - ord('a')] = node

    def set_end(self) -> None:
        self.is_end = True

    def is_end(self) -> bool:
        return self.is_end


class Trie:
    def __init__(self):
        self.root = TrieNode()

    def insert(self, word: str) -> None:
        node = self.root
        for ch in word:
            if not node.contains_key(ch):
                node.put(ch, TrieNode())
            node = node.get(ch)
        node.set_end()

    def search_prefix(self, word: str) -> TrieNode:
        node = self.root
        for ch in word:
            if node.contains_key(ch):
                node = node.get(ch)
            else:
                return None
        return node

    def search(self, word: str) -> bool:
        node = self.search_prefix(word)
        return node is not None and node.is_end()

    def starts_with(self, prefix: str) -> bool:
        node = self._search_prefix(prefix)
        return node is not None