zoukankan      html  css  js  c++  java
  • 字典树

    208. 实现 Trie (前缀树)

    难度中等

    实现一个 Trie (前缀树),包含 insertsearch, 和 startsWith 这三个操作。

    示例:

    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

    说明:

    • 你可以假设所有的输入都是由小写字母 a-z 构成的。
    • 保证所有输入均为非空字符串。
     1 class Trie:
     2 
     3     def __init__(self):
     4         """
     5         Initialize your data structure here.
     6         """
     7         self.root = {}
     8 
     9 
    10     def insert(self, word: str) -> None:
    11         """
    12         Inserts a word into the trie.
    13         """
    14         node = self.root
    15         for char in word:
    16             #setdefault()方法使用指定的键返回项目的值.如果键不存在,则插入这个具有指定值的键.
    17             node =  node.setdefault(char, {}) 
    18 
    19         node["end"] = True
    20 
    21 
    22     def search(self, word: str) -> bool:
    23         """
    24         Returns if the word is in the trie.
    25         """
    26         node = self.root
    27         for char in word:
    28             if char not in node:
    29                 return False
    30             node = node[char]
    31 
    32         return "end" in node
    33 
    34 
    35     def startsWith(self, prefix: str) -> bool:
    36         """
    37         Returns if there is any word in the trie that starts with the given prefix.
    38         """
    39         node =  self.root
    40         for char in prefix:
    41             if char not in node:
    42                 return False
    43             node = node[char]
    44         
    45         return True
    View Code

    插入apple与apply:

     {'a': {'p': {'p': {'l': {'e': {'end': True}}}}}}

     {'a': {'p': {'p': {'l': {'e': {'end': True}, 'y': {'end': True}}}}}}

    设计一个支持以下两种操作的数据结构:

    void addWord(word)
    bool search(word)
    

    search(word) 可以搜索文字或正则表达式字符串,字符串只包含字母 . 或 a-z 。 . 可以表示任何一个字母。

    示例:

    addWord("bad")
    addWord("dad")
    addWord("mad")
    search("pad") -> false
    search("bad") -> true
    search(".ad") -> true
    search("b..") -> true
    

    说明:

    你可以假设所有单词都是由小写字母 a-z 组成的。

     1 class WordDictionary:
     2 
     3     def __init__(self):
     4         """
     5         Initialize your data structure here.
     6         """
     7         self.root = {}
     8 
     9 
    10     def addWord(self, word: str) -> None:
    11         """
    12         Adds a word into the data structure.
    13         """
    14         node = self.root
    15         for char in word:
    16             node = node.setdefault(char, {})
    17         
    18         node['end'] = True
    19 
    20 
    21     def search(self, word: str) -> bool:
    22         """
    23         Returns if the word is in the data structure. A word could contain the dot character '.' to represent any one letter.
    24         """
    25         return self._dfs(self.root, word)
    26 
    27     def _dfs(self, dictionary, word):
    28 
    29         for index, char in enumerate(word):
    30             if char == '.':
    31                 res = 0
    32                 for any_char in dictionary:
    33                     if any_char != 'end':
    34                         temp_res = self._dfs(dictionary[any_char], word[index+1:]) 
    35                         res += temp_res
    36                 return res != 0
    37 
    38             elif char not in dictionary:
    39                 return False
    40                 
    41             else:
    42                 dictionary = dictionary[char]
    43 
    44         return 'end' in dictionary
    View Code
  • 相关阅读:
    设计模式 ( 十七) 状态模式State(对象行为型)
    设计模式 ( 十六 ) 观察者模式Observer(对象行为型)
    设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)
    设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)
    设计模式 ( 十三 ) 命令模式Command(对象行为型)
    设计模式(十一)代理模式Proxy(结构型)
    设计模式(十)享元模式Flyweight(结构型)
    开源项目
    C#中的Marshal
    给枚举加上Description,必要时,可以直接获取枚举类型代表的中文
  • 原文地址:https://www.cnblogs.com/dede-0119/p/12508839.html
Copyright © 2011-2022 走看看