• 剑指 Offer II 062. 实现前缀树


    题目链接

    力扣

    题目描述

    Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。

    请你实现 Trie 类:

    Trie() 初始化前缀树对象。
    void insert(String word) 向前缀树中插入字符串 word 。
    boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。
    boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false 。
     

    示例:

    输入
    inputs = ["Trie", "insert", "search", "search", "startsWith", "insert", "search"]
    inputs = [[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]]
    输出
    [null, null, true, false, true, null, true]

    解释
    Trie trie = new Trie();
    trie.insert("apple");
    trie.search("apple");   // 返回 True
    trie.search("app");     // 返回 False
    trie.startsWith("app"); // 返回 True
    trie.insert("app");
    trie.search("app");     // 返回 True
     

    提示:

    1 <= word.length, prefix.length <= 2000
    word 和 prefix 仅由小写英文字母组成
    insert、search 和 startsWith 调用次数 总计 不超过 3 * 104 次

    解题思路

    哈希表,键为下一个字符,值为指向下个结点的指针

    代码

    Python

    1. class TrieNode:
    2. def __init__(self, char=''):
    3. self.char = char
    4. self.childs = {}
    5. class Trie:
    6. def __init__(self):
    7. """
    8. Initialize your data structure here.
    9. """
    10. self.root = TrieNode()
    11. def insert(self, word: str) -> None:
    12. """
    13. Inserts a word into the trie.
    14. """
    15. node = self.root
    16. for i in range(len(word)):
    17. if node.childs.get(word[i], 0) == 0:
    18. node.childs[word[i]] = TrieNode(word[i])
    19. node = node.childs[word[i]]
    20. else:
    21. node = node.childs[word[i]]
    22. node.childs[''] = '.' # 结束符号
    23. return
    24. def search(self, word: str) -> bool:
    25. """
    26. Returns if the word is in the trie.
    27. """
    28. node = self.root
    29. for i in range(len(word)):
    30. if node.childs.get(word[i], 0) == 0:
    31. return False
    32. else:
    33. node = node.childs[word[i]]
    34. if node.childs.get('', 0) == '.':
    35. return True
    36. return False
    37. def startsWith(self, prefix: str) -> bool:
    38. """
    39. Returns if there is any word in the trie that starts with the given prefix.
    40. """
    41. node = self.root
    42. for i in range(len(prefix)):
    43. if node.childs.get(prefix[i], 0) == 0:
    44. return False
    45. else:
    46. node = node.childs[prefix[i]]
    47. return True
    48. # Your Trie object will be instantiated and called as such:
    49. # obj = Trie()
    50. # obj.insert(word)
    51. # param_2 = obj.search(word)
    52. # param_3 = obj.startsWith(prefix)

    Go

    1. type Trie struct {
    2. childs [26]*Trie
    3. isEnd bool
    4. }
    5. /** Initialize your data structure here. */
    6. func Constructor() Trie {
    7. return Trie{}
    8. }
    9. /** Inserts a word into the trie. */
    10. func (this *Trie) Insert(word string) {
    11. node := this
    12. for _, chr := range word {
    13. idx := chr - 'a'
    14. if node.childs[idx] == nil {
    15. node.childs[idx] = &Trie{}
    16. }
    17. node = node.childs[idx]
    18. }
    19. node.isEnd = true
    20. }
    21. /** Returns if the word is in the trie. */
    22. func (this *Trie) Search(word string) bool {
    23. node := this
    24. for _, chr := range word {
    25. idx := chr - 'a'
    26. if node.childs[idx] == nil {
    27. return false
    28. }
    29. node = node.childs[idx]
    30. }
    31. return node.isEnd
    32. }
    33. /** Returns if there is any word in the trie that starts with the given prefix. */
    34. func (this *Trie) StartsWith(prefix string) bool {
    35. node := this
    36. for _, chr := range prefix {
    37. idx := chr - 'a'
    38. if node.childs[idx] == nil {
    39. return false
    40. }
    41. node = node.childs[idx]
    42. }
    43. return true
    44. }

  • 相关阅读:
    高级SQL语句
    十分钟入门以太和Opensea测试网批量发行NFT实战
    建筑工地无线视频监控 工业级无线路由器应用
    C++:无法查找或打开 PDB 文件?? 如何解决呢?以及产生原因是什么?
    【uni-app】小程序往缓存里添加对象并读取数据
    JAVA基础算法(8)----- 设计循环双端队列
    爆肝3万字,最硬核丨Mysql 知识体系、命令全集 【建议收藏 】
    New Features Of JDK - JDK9 Modular System
    了解 Oracle 中的主键和外键
    flex-shrink 解决实际问题(flex-shrink:0避免图片被压扁)
  • 原文地址:https://blog.csdn.net/qq_33523932/article/details/125614285