[Leetcode] 1804. Implement Trie II

Explore diverse LeetCode solutions in Python, C++, JavaScript, SQL, and TypeScript. Ideal for interview prep, learning, and code practice in multiple programming languages. Github Repo Link

內容目錄

Medium


trie (pronounced as “try”) or prefix tree is a tree data structure used to efficiently store and retrieve keys in a dataset of strings. There are various applications of this data structure, such as autocomplete and spellchecker.

Implement the Trie class:

  • Trie() Initializes the trie object.
  • void insert(String word) Inserts the string word into the trie.
  • int countWordsEqualTo(String word) Returns the number of instances of the string word in the trie.
  • int countWordsStartingWith(String prefix) Returns the number of strings in the trie that have the string prefix as a prefix.
  • void erase(String word) Erases the string word from the trie.

 

Example 1:

Input
["Trie", "insert", "insert", "countWordsEqualTo", "countWordsStartingWith", "erase", "countWordsEqualTo", "countWordsStartingWith", "erase", "countWordsStartingWith"]
[[], ["apple"], ["apple"], ["apple"], ["app"], ["apple"], ["apple"], ["app"], ["apple"], ["app"]]
Output
[null, null, null, 2, 2, null, 1, 1, null, 0]

Explanation
Trie trie = new Trie();
trie.insert("apple");               // Inserts "apple".
trie.insert("apple");               // Inserts another "apple".
trie.countWordsEqualTo("apple");    // There are two instances of "apple" so return 2.
trie.countWordsStartingWith("app"); // "app" is a prefix of "apple" so return 2.
trie.erase("apple");                // Erases one "apple".
trie.countWordsEqualTo("apple");    // Now there is only one instance of "apple" so return 1.
trie.countWordsStartingWith("app"); // return 1
trie.erase("apple");                // Erases "apple". Now the trie is empty.
trie.countWordsStartingWith("app"); // return 0

 

Constraints:

  • 1 <= word.length, prefix.length <= 2000
  • word and prefix consist only of lowercase English letters.
  • At most 3 * 104 calls in total will be made to insertcountWordsEqualTocountWordsStartingWith, and erase.
  • It is guaranteed that for any function call to erase, the string word will exist in the trie.

Python

				
					class TrieNode:
    def __init__(self):
        self.links = [None] * 26
        self.wordsEndingHere = 0
        self.wordsStartingHere = 0


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

    def insert(self, word: str) -> None:
        node = self.root
        for w in word:
            charIndex = ord(w) - ord('a')
            if not node.links[charIndex]:
                node.links[charIndex] = TrieNode()
            node = node.links[charIndex]
            node.wordsStartingHere += 1
        node.wordsEndingHere += 1

    def countWordsEqualTo(self, word: str) -> int:
        node = self.root
        for w in word:
            charIndex = ord(w) - ord('a')
            if not node.links[charIndex]:
                return 0
            node = node.links[charIndex]
        return node.wordsEndingHere

    def countWordsStartingWith(self, prefix: str) -> int:
        node = self.root
        for w in prefix:
            charIndex = ord(w) - ord('a')
            if not node.links[charIndex]:
                return 0
            node = node.links[charIndex]
        return node.wordsStartingHere

    def erase(self, word: str) -> None:
        node = self.root
        for w in word:
            charIndex = ord(w) - ord('a')
            node = node.links[charIndex]
            node.wordsStartingHere -= 1
        node.wordsEndingHere -= 1


# Your Trie object will be instantiated and called as such:

trie = Trie()
trie.insert("apple")
trie.insert("apple")
print(trie.countWordsEqualTo("apple"))
print(trie.countWordsStartingWith("app"))
trie.erase("apple")
print(trie.countWordsEqualTo("apple"))
print(trie.countWordsStartingWith("app"))
trie.erase("apple")
print(trie.countWordsStartingWith("app"))
				
			
zh_TW繁體中文