难度:中等 题目来源:力扣(LeetCode) https://leetcode-cn.com/problems/implement-trie-prefix-tree

    说明:
    实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。

    • 你可以假设所有的输入都是由小写字母 a-z 构成的。
    • 保证所有输入均为非空字符串。

    示例:
    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. type Trie struct {
    2. value string
    3. children map[string]*Trie
    4. isWord bool
    5. }
    6. /** Initialize your data structure here. */
    7. func Constructor() Trie {
    8. return Trie{value: "", children: make(map[string]*Trie), isWord: false}
    9. }
    10. /** Inserts a word into the trie. */
    11. func (this *Trie) Insert(word string) {
    12. root := this
    13. for _, w := range word {
    14. n := root.match(string(w))
    15. if n == nil {
    16. newNode := &Trie{value: string(w), children: make(map[string]*Trie)}
    17. root.children[string(w)] = newNode
    18. root = root.children[string(w)]
    19. } else {
    20. root = n
    21. }
    22. }
    23. root.isWord = true
    24. }
    25. /** Returns if the word is in the trie. */
    26. func (this *Trie) Search(word string) bool {
    27. if n := this.match(word); n != nil && n.isWord {
    28. return true
    29. } else {
    30. return false
    31. }
    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. if n := this.match(prefix); n != nil {
    36. return true
    37. } else {
    38. return false
    39. }
    40. }
    41. func (this *Trie) match(word string) *Trie {
    42. root := this
    43. for _, w := range word {
    44. //node := &Trie{value:string(w), children:make(map[string]*Trie)}
    45. if _, ok := root.children[string(w)]; ok {
    46. root = root.children[string(w)]
    47. } else {
    48. return nil
    49. }
    50. }
    51. return root
    52. }